У нас есть класс Он открыт поэтому мы обращаемся к свойствам
Создали объектам, нажали . и выбрали свойство.
Некоторые классы спрятаны и некоторые свойства спрятаны
.
свойства можно записать в m файл, а можно в header файл. (открытые/закрытые свойства).
Objective-C - это динамический язык. Objective-C это формально не язык
, а надстройка над C
. И в C нет классов.
Поэтому все эти свойства даже которые спрятаны и не видны пользователям - легко достать
.
Это позволяет всякие С функции которые Apple использует для работы Objective-C но мы их можешь использовать для своих целей
Например мы можем взять класс у запросить все поля
- и реально мы увидим все поля.
Мы можем найти класс который не открыт, котороый Apple нам не выделили, но формально мы можем это найти.
У нас есть имя и мы можем получать уведомления - KeyboardWillAppear - например можем отслеживать и менять отступы.
Notification-ы которые отслеживали внутри Xcode. Event-ы Xcode. В `Runtime мы можем получить все скрытое. И когда мы говорим о Runtime для потребительских целей мы говорим о способе достать все скрытые свойства,
достать классы которые Apple скрыло и достать все объекты к которым мы не можем обратиться потому что Apple их скрыло
.
setValueForKey - свойство спрятано, но есть по ключу.
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);