Sobes.tech
Intern

Obyektdan foydalanilsa nima bo'ladi?

sobes.tech AI

AIdan javob

Xabar yuborish ob'ektga. Agar ob'ektda mos keladigan nom (seletor) bilan metod bo'lsa, u bajariladi. Aks holda, bajarilish xatosi yuzaga keladi (tan olinmagan selector ob'ektga yuborildi), agar ob'ekt xabarlarni yuborish mexanizmini amalga oshirmasa.

Objective-C/Swiftda xabarlarni yuborish mexanizmi bir nechta bosqichdan iborat:

  1. Dinamik taqsimot: Ishga tushirish muhit ob'ektning sinfi va uning superklasslarida ushbu selector uchun metod (IMP) ni qidiradi.
  2. Dinamik metod qo'shish: Agar metod topilmasa, ishga tushirish muhit +resolveInstanceMethod: (namuna uchun) yoki +resolveClassMethod: (sinflar uchun) metodini chaqiradi, bu sinfga dinamik ravishda metodni qo'shish imkonini beradi.
  3. Xabarlarni yuborish: Agar metod hali ham topilmasa yoki qo'shilmasa, ishga tushirish muhit xabarni boshqa ob'ektga yuborishga harakat qiladi, forwardingTargetForSelector: va keyin methodSignatureForSelector: va forwardInvocation: metodlarini chaqiradi.

Agar bu bosqichlarning hech biri xabarni ishlov berishga olib kelmasa, NSInvalidArgumentException istisnosi yuzaga keladi.

Misol Objective-C da:

@implementation MyObject

- (void)myMethod {
    // Metodning amalga oshirilishi
    NSLog(@"myMethod called");
}

@end

// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Xabar yuborish

Misol Swift (noaniq):

class MySwiftObject {
    func mySwiftMethod() {
        // Metodning amalga oshirilishi
        print("mySwiftMethod called")
    }
}

let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Xabar yuborish (standart dinamik taqsimot orqali)

Swiftda ob'ektning xususiyatlariga kirish let va var uchun @objc dynamic bo'lmagan holda statik taqsimotni ishlatadi. Ammo, agar xususiyat @objc dynamic bilan belgilangan bo'lsa, unga kirish ham dinamik taqsimotni ishlatadi, Objective-C da xabar yuborish bilan o'xshash tarzda.