2016-07-25 1 views
0

Я читал, что на IOS выполнения, класс становится структура (так и другие ос объекты), которые, как показано ниже:Почему Apple использует двойные указатели для списков методов в классе типа структуры на IOS выполнения

struct objc_class { 

    Class isa OBJC_ISA_AVAILABILITY; 

#if !__OBJC2__ 

    Class super_class      OBJC2_UNAVAILABLE; 

    const char *name      OBJC2_UNAVAILABLE; 

    long version       OBJC2_UNAVAILABLE; 

    long info        OBJC2_UNAVAILABLE; 

    long instance_size      OBJC2_UNAVAILABLE; 

    struct objc_ivar_list *ivars   OBJC2_UNAVAILABLE; 

    struct objc_method_list **methodLists OBJC2_UNAVAILABLE; 

    struct objc_cache *cache    OBJC2_UNAVAILABLE; 

    struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; 

#endif 

} OBJC2_UNAVAILABLE; 

В выше структура, есть это:

struct objc_method_list **methodLists OBJC2_UNAVAILABLE; 

Я новичок в C, и я не совсем понимаю, почему OC использует указатель на указатель ** для списка методов.

Почему не использовать точно такую ​​же структуру, как кэш:

struct objc_cache *cache    OBJC2_UNAVAILABLE; 

Поскольку кэш также содержит методы, которые использовались ранее.

Я думаю, что Apple, использует двойные указатели ** для method lists вместо одного одного * для cache или protocols по причине.

И почему это называется methodLists вместо methodList?

Я сейчас сравниваю cache, protocols с methodLists.

Я думаю, что Apple использует ** для списков методов вместо * для других по технической причине, и я хочу знать.

Если одного указателя * достаточно для списков методов, почему Apple беспокоило использование двойного **?

+0

Вы изучаете определение для классов ObjC 2. Эта спецификация довольно старая, так как у нас ObjC 2.x уже несколько лет (не менее 6, IIRC). В любом случае вы спрашиваете, почему Apple (или даже NeXT) разработала его таким образом, и это мнение. Вопрос не принадлежит SO. – Avi

+0

My C ржавый, но разве это не так, как объявить массив указателей, которые будут malloc'd? – danh

+0

@Avi Я не спрашиваю мнения, я спрашиваю, почему я не могу просто использовать простой связанный список '* methodList', например' * protocols' или '* cache', и почему это' methodLists' вместо 'methodList '. – Boris

ответ

0

Похожий вопрос: Whats is methodLists attribute of the structure objc_class for?

Согласно посту выше, и этой article, причина Apple, разработанному methodLists с двойными указателями (это то же самое для OBJC2.0) является то, что на короткое время, структура двойных указателей быстрее добавив category методов в список методов класса во время выполнения.

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

Я не уверен, если я объясню это достаточно ясно.