Для чего нужен атрибут methodLists структуры objc_class? - PullRequest
2 голосов
/ 13 января 2012

Заглянув внутрь runtime.h, я нашел определение структуры objc_class.

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

struct objc_method_list ** methodLists

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

Почему бы не один список?

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

Ответы [ 2 ]

3 голосов
/ 29 октября 2012

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

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

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

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

2 голосов
/ 02 июля 2012

Цель объяснена в objc-class.m , как связано с Георгом:

cls-> methodLists может иметь одну из трех форм:

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

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

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

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

...