2012-01-13 3 views
2

Внутри runtime.h я нашел определение структуры objc_class.Что такое атрибут methodLists для структуры objc_class?

Среди различных членов, у нас есть это: -

структура objc_method_list ** methodLists

Мы, безусловно, должны знать, что все методы класса есть, Но список методов должны быть тонкими, но почему у нас есть «списки»?

Почему не только один список?

Кроме того, может ли кто-либо указать, что методы, унаследованные от части суперкласса этого списка, или мы получаем их через указатель суперкласса, который указывает на структуру родительского класса.

+0

Я только посмотрел на [источник] (http://opensource.apple.com/tarballs/objc4/objc4-493.11.tar.gz), но, похоже, это деталь реализации (см. комментарий в ['objc-class.m'] (http://opensource.apple.com/source/objc4/objc4-493.11/runtime/objc-class.m)). –

ответ

1

Цель объясняется в objc-class.m, как связанные с Georg:

> methodLists CLS-могут находиться в одном из трех форм:

  1. NULL: Класс не имеет методов.
  2. non-NULL, с CLS_NO_METHOD_ARRAY set: cls-> methodLists указывает на единственный список методов, который является единственным списком методов класса.
  3. non-NULL, с CLS_NO_METHOD_ARRAY clear: cls-> methodLists указывает на массив указателей списка методов. Конец блока массива установлен в -1. Если фактическое количество списков методов меньше , то остальная часть массива равна NULL.

Прикрепление категорий и добавление и удаление классов может изменить форму списка классов. Кроме того, индивидуальные списки методов могут быть перераспределены при их установке.

Классы изначально считаны как # 1 или # 2. Если категория добавлена ​​ или другие методы добавлены, класс изменяется на # 3. Когда-то в форме # 3, класс никогда не понижается до # 1 или # 2, даже если методы удалены. Классы, добавленные с objc_addClass, изначально либо # 1, либо # 3.

Короткий ответ поэтому «из-за категорий». Когда категория вводится, а не пытается объединить свой список методов с одним существующим списком, новая запись просто добавляется к methodLists и устанавливается в список, исходящий из категории. Это, вероятно, ускоряет загрузку категории, поскольку она позволяет избежать (потенциального) больших перераспределений и копирования.

3

Вот мое исследование подробно в STRUCT objc_method_list ** methodLists: http://blog.csdn.net/jasonblog/article/details/7303618

И в коротких, methodLists хранит SEL-IMP отображение методов экземпляра по умолчанию. В этой ситуации он имеет только один список.

Как следует из названия 'methodLists', оно может содержать более одного списка. Если вы добавите категорию в класс, система времени выполнения добавит еще один список в список методов, который указывает на список методов категории.

Я попытался ответить на этот вопрос несколько месяцев назад, но в то время я отбросил свой ответ из-за проблемы с сетью. Теперь я встречаюсь снова :)

Смежные вопросы