alloc
が呼び出されると、最初のobjc_msgSend *機能の一つに(コンパイラによって)変換されます、それ(他のメッセージ送信など)。この関数は、クラス構造体ポインタを最初の引数として取得し、@selector(alloc)
をその第2引数として取得します。
次に、objc_msgSendは、一般的にはオーバーライドされない+[class alloc]
の対応するメソッド実装を検索します(カスタム初期化は概念的には-initWith ...で行われるため、一般的に+ [NSObject alloc]になります)。 allocは単純に+ [NSObject allocWithZone:]を呼び出します。
1)クラスのistanceサイズを(恐らくclass_getInstanceSize()経由で) 2)それはおそらくclass_createInstance()関数を使ってメモリを割り当てます。この関数は、割り当てられたメモリを0にクリアします(つまり、仕様上、すべてのivarsが起動時に明示的に0に初期化されます)。次にnewliyで作成されたオブジェクトのisa
ポインタをクラス構造自体に設定します。 3)allocWithZone:メソッドは、allocへの新しいオブジェクトポインタを返します。 4)allocは、オブジェクトポインタを送信者に返します。おそらく、[Class initWith...:]
に実行されます。
これが役に立ちます。また、Obj-Cランタイムのドキュメントとは別に、GNUstep NSObjectの実装をチェックすることを忘れないでください。これは、GNUの人々がどのようにそれを実装し、どのようにAppleがそれを実装したかという論理と可能な方法です。