В каком случае среда выполнения может генерировать отсортированный список методов в iOS - PullRequest
0 голосов
/ 02 декабря 2018

В исходном коде среды выполнения (версия 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;
}

Среда выполнения будет определять, отсортирован ли список методов, ивыберите либо линейный поиск, либо бинарный поиск.

Если список методов отсортирован, очевидно, что двоичный поиск лучше, в противном случае это должен быть линейный поиск.

Так что мой вопрос в том, в каком случае методы в одном классе будут отсортированы?

Когда они будут отсортированы?Кем?

1 Ответ

0 голосов
/ 04 декабря 2018

Посмотрите, когда для флага isFixedUp установлено значение true.

https://opensource.apple.com/source/objc4/objc4-706/runtime/objc-runtime-new.mm.auto.html

В основном, когда процесс запущен, dyld и среда выполнения оба имеют "fix"фазы up, где они связывают воедино символы, оптимизируют кучу вещей и, в противном случае, готовят приложение к работе.

Фаза исправлений ObjC может оптимизировать компоновку списков методов, чтобы ускорить последующий поиск.В частности, исправление гарантирует, что каждый селектор уникален;т. е. селектор метода одного объекта layoutSubviews будет побитно идентичен селектору другого, а не просто будет указывать на две копии одного и того же char*.Он также сортирует списки, что, по-видимому, также ускоряет поиск.

После исправления, поиск методов может идти по быстрому пути (вызов findMethodInSortedMethodList).Если не исправить, то среда выполнения выполняет линейный поиск (как показывает этот код).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...