Objective-C що таке насправді метод і self? + Runtime +10
- 18.11.15 7:06 •
- ajjnix •
- # 270913 •
- Хабрахабр •
- 4 •
- 5800
- такий же як Forbes, тільки краще.
Є методи класу, є методи примірників класу. Давайте тимчасово забудемо, що клас має методи, пізніше ми обов'язково до цього повернемося - так буде менше плутанини при читанні статті.
Не будемо приділяти додаткову увагу тому, як відбувається пошук методу в Objective-C, для це є відповідні статті, досить навіть вікіпедії.
Отже, ми починаємо.
Пошук методу відбувається по dispatch table у isa, йдучи вниз. Саме тому всі методи в Objective-C є віртуальними, включаючи private.
І тому ж ми можемо звернутися в метод, знаючи його селектор.
Ключем в dispatch table є SEL (селектор, детальний розбір), а значенням IMP (реалізація, звичайнісінька C функція)
Метод - це функція? Про це пізніше.
За малюнком, таблиця дочірнього класу не включає в себе таблицю батьківського класу, але використовує композицію. Перевіримо це на практиці:
Отримання dispatch table класу
На початку статті, я попросив забути про те, що у класу є методи і що в Objective-C це об'єкт. Так ось, скасуйте.
Дійсно, клас - це об'єкт мета-класу. У нього є свої методи, своя власна dispatch table, свій isa. Також він володіє своєю точкою входу (+ initializer).
Ми точно так само можемо додати класу метод, як і робили це раніше. За винятком одного моменту, що потрібно отримати мета-клас.
Демонстрація, різних dispatch table, використання мета-класу
Виклик методу як функцію