OCオブジェクト作成プロセス

2393 ワード

OCを利用してアプリケーションを開発するには、オブジェクトを大量に作成する必要がありますが、そのプロセスは何ですか?
例えば、NSArray*array=[[NSArrayalloc]init];
説明する前に、OCのClassについて説明します.

Class


Objective-CクラスはClassタイプで表され、実際にはobjc_を指すclass構造体のポインタ.定義は次のとおりです.
typedef struct objc_class *Class;

objc/runtimeを表示します.h中objc_class構造体の定義は次のとおりです.
struct objc_class {
    Class isa;

#if !__OBJC2__
    Class super_class                       OBJC2_UNAVAILABLE;  //  
    const char *name                        OBJC2_UNAVAILABLE;  //  
    long version                            OBJC2_UNAVAILABLE;  //  , 0
    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;

説明:
isa:Objective-Cでは、すべてのクラス自体もオブジェクトであり、このオブジェクトのClassにもisaポインタがあり、metaClass(メタクラス)を指しています.後で紹介します.
super_class:クラスの親クラスを指します.クラスがNSObjectやNSProxyなどの最上位レベルのルートクラスである場合、super_classはNULLです.
Cache:最近使用されたメソッドをキャッシュします.受信者オブジェクトがメッセージを受信すると、isaポインタに基づいてメッセージに応答できるオブジェクトが検索されます.実際の使用では、このオブジェクトには一部の方法しか使われておらず、実際にはあまり使われていないか、まったく使えない方法が多い.この場合、メッセージが来るたびにmethodListsを巡回すると、パフォーマンスが悪くなるに違いありません.この時、cacheは役に立ちました.メソッドを呼び出すたびに、このメソッドはcacheリストにキャッシュされ、次回呼び出すときにruntimeはcacheに優先的に検索され、cacheがなければmethodListsにメソッドが検索されます.これにより、よく用いられる方法の呼び出しに対しては、呼び出しの効率が向上する.
バージョン:このフィールドを使用してクラスのバージョン情報を提供できます.これは、オブジェクトのシーケンス化に役立ちますが、異なる定義バージョンのインスタンス変数レイアウトの変更を識別します.
次にarrayオブジェクトを例に挙げて、その実行手順を説明します.
[NSArray alloc]が先に実行される.NSArrayには+allocメソッドがないので、親NSObjectを検索します.
NSObjectが+allocメソッドに応答するかどうかを検出し、応答を検出すると、NSArrayクラスを検出し、必要なメモリ領域サイズに基づいてメモリ領域の割り当てを開始し、isaポインタをNSArrayクラスに向けます.また,+allocもcacheメソッドリストに追加される.
次に-initメソッドを実行し、NSArrayがこのメソッドを鳴らすとcacheメソッドのリストに直接追加する.応答しない場合は、親を検索します.
後期の操作で[[NSArray alloc]init]のように配列を作成すると、cacheメソッドのリストから対応するメソッドが直接取り出され、直接呼び出されます.