Skip to content

Instantly share code, notes, and snippets.

@arturlector
Last active March 13, 2016 20:14
Show Gist options
  • Save arturlector/811ab333c46b4fa2a46f to your computer and use it in GitHub Desktop.
Save arturlector/811ab333c46b4fa2a46f to your computer and use it in GitHub Desktop.
Objective-C Runtime. Суть Runtime? Отправка сообщений? Ассоциативные ссылки?

Как работает Objective-C Runtime? Суть Runtime? Что такое Runtime?

У нас есть класс Он открыт поэтому мы обращаемся к свойствам

Создали объектам, нажали . и выбрали свойство.

Некоторые классы спрятаны и некоторые свойства спрятаны.

свойства можно записать в m файл, а можно в header файл. (открытые/закрытые свойства).

Objective-C - это динамический язык. Objective-C это формально не язык, а надстройка над C. И в C нет классов. Поэтому все эти свойства даже которые спрятаны и не видны пользователям - легко достать.

Это позволяет всякие С функции которые Apple использует для работы Objective-C но мы их можешь использовать для своих целей

Например мы можем взять класс у запросить все поля - и реально мы увидим все поля.

Мы можем найти класс который не открыт, котороый Apple нам не выделили, но формально мы можем это найти.

У нас есть имя и мы можем получать уведомления - KeyboardWillAppear - например можем отслеживать и менять отступы.

Notification-ы которые отслеживали внутри Xcode. Event-ы Xcode. В `Runtime мы можем получить все скрытое. И когда мы говорим о Runtime для потребительских целей мы говорим о способе достать все скрытые свойства,

достать классы которые Apple скрыло и достать все объекты к которым мы не можем обратиться потому что Apple их скрыло.

setValueForKey - свойство спрятано, но есть по ключу.

Суть рантайма (Runtime)?

1. Отправление сообщения - сишные функции, которые производят 

2. Манипулирование классами(class_addMethod, class_addIvar, class_replaceMethod), 

3. Cоздание новых классов (class_allocateClassPair, class_registerClassPair),

4. Интроспекция (class_getName, class_getSuperclass, class_getInstanceVariable,
class_getProperty, class_copyMethodList, class_copyIvarList, class_copyPropertyList), 

5. Манипулирование объектами (objc_msgSend, objc_getClass, object_copy),

6. Работу с ассоциативными ссылками 

Отправка сообщений

[array insertObject:foo atIndex:1]; -> objc_msgSend(array, @selector(insertObject:atIndex:), foo, 1);

Ассоциативные ссылки

objc_setAssociatedObject(self, &key, newProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_getAssociatedObject(self, &key);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment