Intern
Объектке кайр кылсак эмне болот?
sobes.tech AI
AIден жооп
Объектке билдирүү жөнөтүлөт. Эгер объектте тиешелүү аталыштагы (селектора) метод болсо, ал ишке ашырылат. Эгер жок болсо, иштөө ката болот (unrecognized selector sent to instance), эгер гана объект билдирүүлөрдү өткөрүү механизмин ишке ашырбаса:
Билдирүүлөрдү өткөрүү механизми Objective-C/Swiftте бир нече этаптан турат:
- Динамикалык dispatcher: Иштөө чөйрөсү объекттин классы жана анын ата-энелеринин класстарында бул селектор үчүн методдун (IMP) ишке ашырылышын издейт.
- Динамикалык методдорду кошуу: Эгер ишке ашырылыш табылбаса, иштөө чөйрөсү
+resolveInstanceMethod:(мисалдар үчүн) же+resolveClassMethod:(класстар үчүн) методун чакырып, классга динамикалык түрдө методдун ишке ашырылышын кошууга мүмкүнчүлүк берет. - Билдирүүлөрдү өткөрүү: Эгер метод дагы табылбаса же кошулбаса, иштөө чөйрөсү билдирүүнү башка объектке өткөрүүгө аракет кылат,
forwardingTargetForSelector:жана андан кийинmethodSignatureForSelector:жанаforwardInvocation:методдорун чакырып.
Эгер бул этаптардын эч бири билдирүүнү иштетүүгө жетпесе, NSInvalidArgumentException ката чыгат.
Objective-C мисалы:
@implementation MyObject
- (void)myMethod {
// Методтун ишке ашырылышы
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // myMethod билдирүүсү
Swift (жасырын) мисалы:
class MySwiftObject {
func mySwiftMethod() {
// Методтун ишке ашырылышы
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // билдирүү жөнөтүү mySwiftMethod (өзүнчө динамикалык dispatcher аркылуу)
Swiftте объекттин мүнөздөрүнө кайрылуу, алдын ала айтканда, let жана var үчүн статикалык dispatcher колдонулат, эгер @objc dynamic белгиси коюлбаса. Бирок, эгер мүнөздө @objc dynamic белгиленсе, кайрылуу да Objective-Cдегидей динамикалык dispatcher аркылуу ишке ашат.