Агар ба объект муроҷиат кунед, чӣ мешавад?
sobes.tech AI
Ҷавоб аз AI
Паёми ба объект фиристед. Агар объект доро бошад, ки бо номи мувофиқ (селектор) як усул дошта бошад, он иҷро мешавад. Агар не, хатои иҷроӣ рух медиҳад (селектори ношинохта ба намуна фиристода шуд), агар ки объект механизмҳои фиристодани паёмҳоро амалӣ накунад.
Механизми фиристодани паёмҳо дар Objective-C/Swift аз чанд марҳила иборат аст:
- Тақсимоти динамикӣ: муҳити иҷроӣ ҷустуҷӯи иҷрои усул (IMP) барои селектор дар синфи объект ва суперсинфҳои он.
- Иловаи динамикии усулҳо: Агар иҷрои усул ёфт нашуд, муҳити иҷроӣ мефонад, ки методи
+resolveInstanceMethod:(барои намунаҳо) ё+resolveClassMethod:(барои синфҳо) -ро даъват кунад, то имконият диҳад, ки синф усули худро ба таври динамикӣ илова кунад. - Фиристодани паём: Агар усул ҳанӯз ёфт нашуда бошад ё илова нашуда бошад, муҳити иҷроӣ кӯшиш мекунад, ки паёмро ба объекти дигар фиристад, бо даъвати методҳои
forwardingTargetForSelector:ва сипасmethodSignatureForSelector:ваforwardInvocation:.
Агар ягон марҳила паёмро коркард накунад, истиснои NSInvalidArgumentException рух медиҳад.
Масалан дар Objective-C:
@implementation MyObject
- (void)myMethod {
// Иҷрои усул
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // фиристодани паём
Масалан дар Swift (ғайрирасмӣ):
class MySwiftObject {
func mySwiftMethod() {
// Иҷрои усул
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // фиристодани паём mySwiftMethod (бо истифода аз тақсимоти динамикӣ ба таври пешфарз)
Дастрасӣ ба хусусиятҳои объект дар Swift ба таври пешфарз истифодаи тақсимоти статикӣ барои let ва var бе @objc dynamic мекунад. Аммо, агар хусусият ҳамчун @objc dynamic ишора шуда бошад, дастрасӣ ба он низ бо истифода аз тақсимоти динамикӣ хоҳад буд, монанди фиристодани паёмҳо дар Objective-C.