Динамическое разрешение метода
В этой главе описываются, как можно обеспечить реализацию метода динамично.
Динамическое разрешение метода
Существуют ситуации, где Вы могли бы хотеть обеспечить реализацию метода динамично. Например, Objective C объявил функцию свойств (см. Заявленные Свойства в Языке программирования Objective C), включает @dynamic
директива:
@dynamic propertyName; |
который говорит компилятору, что методы, связанные со свойством, будут предоставлены динамично.
Можно реализовать методы resolveInstanceMethod:
и resolveClassMethod:
динамично обеспечить реализацию для данного селектора для метода экземпляра и метода класса соответственно.
Метод Objective C является просто функцией C, которые берут по крайней мере два параметра —self
и _cmd
. Можно добавить функцию к классу как метод с помощью функции class_addMethod
. Поэтому учитывая следующую функцию:
void dynamicMethodIMP(id self, SEL _cmd) { |
// implementation .... |
} |
можно динамично добавить его к классу как метод (вызванный resolveThisMethodDynamically
) использование resolveInstanceMethod:
как это:
@implementation MyClass |
+ (BOOL)resolveInstanceMethod:(SEL)aSEL |
{ |
if (aSEL == @selector(resolveThisMethodDynamically)) { |
class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:"); |
return YES; |
} |
return [super resolveInstanceMethod:aSEL]; |
} |
@end |
Передача методов (как описано в Передаче сообщения) и динамическое разрешение метода является, в основном, ортогональной. Класс имеет возможность динамично разрешить метод, прежде чем умрет передающий механизм. Если respondsToSelector:
или instancesRespondToSelector:
вызывается, динамическому преобразователю метода дают возможность обеспечить IMP
для селектора сначала. Если Вы реализуете resolveInstanceMethod:
но хочу, чтобы определенные селекторы фактически были переданы через передающий механизм, Вы возвращаетесь NO
для тех селекторов.
Динамическая загрузка
Программа Objective C может загрузить и соединить новые классы и категории, в то время как она работает. Новый код включен в программу и обработан тождественно к классам и категориям, загруженным в запуске.
Динамическая загрузка может использоваться, чтобы сделать много разных вещей. Например, различные модули в приложении Установок системы динамично загружаются.
В среде Какао динамическая загрузка обычно используется, чтобы позволить приложениям быть настроенными. Другие могут записать модули, что Ваши загрузки программы во время выполнения — очень как Интерфейсный Разработчик загружают заказные палитры и загрузки приложения Установок системы OS X пользовательские предпочтительные модули. Загружаемые модули расширяют то, что может сделать Ваше приложение. Они способствуют ему способами, которыми Вы разрешаете, но, возможно, не ожидали или определили себя. Вы служите основой, но другие обеспечивают код.
Несмотря на то, что существует функция времени выполнения, выполняющая динамическую загрузку модулей Objective C в Мужественных файлах (objc_loadModules
, определенный в objc/objc-load.h
), Какао NSBundle
класс обеспечивает значительно более удобный интерфейс для динамической загрузки — один это объектно-ориентировано и интегрировано со связанными службами. Посмотрите NSBundle
спецификация класса в ссылке платформы Основы для получения информации о NSBundle
класс и его использование. Посмотрите OS X ABI Мужественная Ссылка Формата файла для получения информации о Мужественных файлах.