2016-07-25 6 views
0

にクラス型の構造体に方式リストのための二重のポインタを使用していますなぜ私はiOSのランタイムに、クラスは以下のようである構造体(ので、他のOCオブジェクトである)になるという読み:上記で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が理由cacheまたはprotocolsためmethod listsの代わりに、単一のもの*ため**ダブルポインタを使用していますね。

methodListの代わりにmethodListsと表示されるのはなぜですか。

私は今、cache,protocolsmethodListsを比較しています。

アップルは、テクニカルな理由から、*の代わりに**をメソッドリストに使用していると思います。私は知りたいと思います。

ポインタが*の場合は、Appleがdouble **を使用していないのをなぜ覚えていますか?

+0

ObjC 2のpreクラスの定義があります。 ObjC 2.xは何年にもわたっています(少なくとも6、IIRC)。その仕様はかなり古いものです。いずれにしても、なぜApple(またはNeXT)がそれをそのように設計したのか、それはその意見です。問題はSOに属していません。 – Avi

+0

私のCは錆びますが、mallocされるポインタの配列をどのように宣言するのでしょうか? – danh

+0

@Avi私は意見を求めていませんが、私は単純なリンクリスト '* method'を' * protocols'や '* cache'のように使うことができない理由と、' methodListの代わりに 'methodLists' '。 – Boris

答えて

0

同様の質問:Whats is methodLists attribute of the structure objc_class for?

上記の記事によると、このarticle、Appleは二重のポインタでmethodListsを設計した理由は、(それがOBJC2.0でも同じです)簡単に、ダブルポインタの構造がために高速である、ということです実行時にcategoryメソッドをクラスのメソッドリストに追加します。

ダブルポインタはメソッドリストのリストであるため、各カテゴリにはメソッドリストが1つあり、実行時にクラスに1つ以上のカテゴリを追加する場合は、メソッドを1つずつ追加するのではなく、各リスト/配列ポインタへのポインタを有するクラスmethodListsへのカテゴリメソッドリストへのポインタ。

私はこれを明確に説明しても分かりません。

関連する問題