2012-01-13 2 views
3

私はObjective Cオブジェクトがどのくらい正確に作成されるのか知りたいと思っていました。私は別のブログ記事とリンゴのドキュメントを読んできましたが、ivarとobjc_classの構造や、他のさまざまな実行時のメソッドや構造については不完全な情報しか見つけられませんでした。allocまたはallocWithZoneを呼び出すとどうなりますか?

しかし、私はまだ得られませんでした。クラスでallocを呼び出すとどうなりますか?スーパークラスのデータメンバーはどのように構造に追加されますか?

可能であれば、私にこれを説明するか、実際にメモリを割り当てるこれらのメソッドのソースコードを指摘できますか?

答えて

4

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がそれを実装したかという論理と可能な方法です。