2016-07-25 21 views
0

ich, dass auf iOS Laufzeit gelesen wird Klasse struct (so sind andere oc Objekte), die unten wie ist:Warum Apple Doppelzeiger für Methodenlisten in Klasse-Typ-Struktur verwendet, um auf iOS Laufzeit

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; 

In oben Struktur gibt es diese:

struct objc_method_list **methodLists OBJC2_UNAVAILABLE; 

ich bin Neuling in C und ich verstehe nicht ganz, warum OC-Zeiger mit ** für Methodenliste auf Zeiger.

struct objc_cache *cache    OBJC2_UNAVAILABLE; 

Da Cache enthält auch Methoden, die früher verwendet wurden:

Warum gerade die gleiche Struktur wie Cache es nicht verwenden.

Ich denke, Apple Doppelzeiger ** für method lists statt einzelner * für cache oder protocols aus einem Grunde verwendet.

Und warum heißt es methodLists statt methodList?

Ich vergleiche jetzt cache, protocols mit methodLists.

Ich denke, Apple verwendet ** für Methodenlisten anstelle von * für andere aus einem technischen Grund und ich möchte wissen.

Wenn ein Zeiger * ist genug für Methodenlisten, warum Apple störte mit Doppel **?

+0

Sie betrachten eine Definition für vor ObjC 2 Klassen. Diese Spezifikation ist mittlerweile ziemlich alt, da wir bereits seit einigen Jahren ObjC 2.x haben (mindestens 6, IIRC). Auf jeden Fall fragst du, warum Apple (oder sogar NeXT) es so entworfen hat, und das ist die Meinung. Die Frage gehört nicht zu SO. – Avi

+0

Mein C ist rostig, aber ist das nicht so, wie man eine Reihe von Zeigern deklariert, die malloziert werden? – danh

+0

@Avi Ich frage nicht die Meinung, ich frage, warum ich nicht einfach eine einfache verknüpfte Liste '* methodList' wie '* protocols' oder' * cache' verwenden kann, und warum es 'methodLists' anstelle von' methodList ist '. – Boris

Antwort

0

ähnliche Frage: Whats is methodLists attribute of the structure objc_class for?

Gemäß die oben genannte Post und diesen article entwarf der Grund Apple-methodLists mit Doppelzeigern (es ist das gleiche für OBJC2.0) besteht darin, dass, kurz gesagt, die Struktur des Doppelzeigers ist schneller für Hinzufügen von category Methoden in die Methodenliste der Klasse zur Laufzeit.

Da Doppelzeiger sind für eine Liste von Methodenliste, so betrachten jede Kategorie hat eine Methodenliste, und wenn Sie eine oder mehrere Kategorien in der Laufzeit hinzufügen, anstatt Methoden einzeln hinzufügen, kann man einfach den Zeiger hinzufügen zur Kategorie Methodenliste zu der Klasse methodLists, die einen Zeiger auf jede Liste/Array-Zeiger hat.

Ich bin mir nicht sicher, ob ich das klar genug erkläre.