Objective-c що таке насправді метод і self runtime

Objective-C що таке насправді метод і self? + Runtime +10

  • 18.11.15 7:06 •
  • ajjnix •
  • # 270913 •
  • Хабрахабр •
  • 4 •
  • 5800

- такий же як Forbes, тільки краще.

Objective-c що таке насправді метод і self runtime



Є методи класу, є методи примірників класу. Давайте тимчасово забудемо, що клас має методи, пізніше ми обов'язково до цього повернемося - так буде менше плутанини при читанні статті.
Не будемо приділяти додаткову увагу тому, як відбувається пошук методу в Objective-C, для це є відповідні статті, досить навіть вікіпедії.

Отже, ми починаємо.

Пошук методу відбувається по dispatch table у isa, йдучи вниз. Саме тому всі методи в Objective-C є віртуальними, включаючи private.

І тому ж ми можемо звернутися в метод, знаючи його селектор.

Ключем в dispatch table є SEL (селектор, детальний розбір), а значенням IMP (реалізація, звичайнісінька C функція)

Метод - це функція? Про це пізніше.

За малюнком, таблиця дочірнього класу не включає в себе таблицю батьківського класу, але використовує композицію. Перевіримо це на практиці:

Отримання dispatch table класу

На початку статті, я попросив забути про те, що у класу є методи і що в Objective-C це об'єкт. Так ось, скасуйте.

Дійсно, клас - це об'єкт мета-класу. У нього є свої методи, своя власна dispatch table, свій isa. Також він володіє своєю точкою входу (+ initializer).

Ми точно так само можемо додати класу метод, як і робили це раніше. За винятком одного моменту, що потрібно отримати мета-клас.

Демонстрація, різних dispatch table, використання мета-класу

Виклик методу як функцію

Схожі статті