В исходном коде среды выполнения (версия objc4-723
) при отправке сообщения объекту среда выполнения может искать метод двумя способами:
/***********************************************************************
* getMethodNoSuper_nolock
* fixme
* Locking: runtimeLock must be read- or write-locked by the caller
**********************************************************************/
static method_t *search_method_list(const method_list_t *mlist, SEL sel) {
int methodListIsFixedUp = mlist->isFixedUp();
int methodListHasExpectedSize = mlist->entsize() == sizeof(method_t);
if (__builtin_expect(methodListIsFixedUp && methodListHasExpectedSize, 1)) {
return findMethodInSortedMethodList(sel, mlist);
} else {
// Linear search of unsorted method list
for (auto& meth : *mlist) {
if (meth.name == sel) return &meth;
}
}
#if DEBUG
// sanity-check negative results
if (mlist->isFixedUp()) {
for (auto& meth : *mlist) {
if (meth.name == sel) {
_objc_fatal("linear search worked when binary search did not");
}
}
}
#endif
return nil;
}
Среда выполнения будет определять, отсортирован ли список методов, ивыберите либо линейный поиск, либо бинарный поиск.
Если список методов отсортирован, очевидно, что двоичный поиск лучше, в противном случае это должен быть линейный поиск.
Так что мой вопрос в том, в каком случае методы в одном классе будут отсортированы?
Когда они будут отсортированы?Кем?