load
вызывается, когда class
добавляется в среду выполнения obj-c.
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/#//apple_ref/occ/clm/NSObject/load
Итак, допустим, если UIViewController
будет добавлен в среду выполнения obj-c, которая уже содержит viewWillAppear:
, но вы хотите, чтобы он был заменен другой реализацией. Итак, сначала вы добавляете новый метод xxxWillAppear:
. Теперь, когда xxxWillAppear:
был добавлен в класс ViewController
, только тогда вы можете его заменить.
Но автор также сказал:
Например, предположим, что мы хотели отслеживать, сколько раз каждый контроллер представления представлен пользователю в приложении iOS.
поэтому он пытается продемонстрировать случай, когда приложение может иметь много контроллеров представления, но вы не хотите продолжать заменять их для каждой ViewController
реализации viewWillAppear:
. После замены точки viewWillAppear:
вместо добавления нужно будет выполнить только обмен.
Возможно, поможет исходный код среды выполнения Objective C:
/**********************************************************************
* addMethod
* fixme
* Locking: runtimeLock must be held by the caller
**********************************************************************/
static IMP
addMethod(Class cls, SEL name, IMP imp, const char *types, BOOL replace)
{
IMP result = nil;
rwlock_assert_writing(&runtimeLock);
assert(types);
assert(cls->isRealized());
method_t *m;
if ((m = getMethodNoSuper_nolock(cls, name))) {
// already exists
if (!replace) {
result = _method_getImplementation(m);
} else {
result = _method_setImplementation(cls, m, imp);
}
} else {
// fixme optimize
method_list_t *newlist;
newlist = (method_list_t *)_calloc_internal(sizeof(*newlist), 1);
newlist->entsize_NEVER_USE = (uint32_t)sizeof(method_t) | fixed_up_method_list;
newlist->count = 1;
newlist->first.name = name;
newlist->first.types = strdup(types);
if (!ignoreSelector(name)) {
newlist->first.imp = imp;
} else {
newlist->first.imp = (IMP)&_objc_ignored_method;
}
attachMethodLists(cls, &newlist, 1, NO, NO, YES);
result = nil;
}
return result;
}
BOOL
class_addMethod(Class cls, SEL name, IMP imp, const char *types)
{
if (!cls) return NO;
rwlock_write(&runtimeLock);
IMP old = addMethod(cls, name, imp, types ?: "", NO);
rwlock_unlock_write(&runtimeLock);
return old ? NO : YES;
}
IMP
class_replaceMethod(Class cls, SEL name, IMP imp, const char *types)
{
if (!cls) return nil;
rwlock_write(&runtimeLock);
IMP old = addMethod(cls, name, imp, types ?: "", YES);
rwlock_unlock_write(&runtimeLock);
return old;
}
Вы можете копать больше, если хотите:
http://www.opensource.apple.com/source/objc4/objc4-437/
person
Anand
schedule
29.12.2015