0
    SomeClass *obj = [SomeClass alloc];
    NSLog(@"%@", obj);
    obj = [obj initWithNSNumber:[NSNumber numberWithInt:1]];
    NSLog(@"%@", obj);

両方のログ ステートメントは、常に同じアドレスを表示します。これは実際に私が予想したことですが、これは標準の Objective-C の動作ですか? つまり、これは異なるコンパイラ/言語バージョンでも同じであると数えることができますか?

私が本当に欲しいのは、Objective-C でオブジェクトの初期化と関連プロセスが実際にどのように機能するかについての優れたチュートリアルです。

編集:ウェインの回答が質問に情報を追加した後:初期化子が次のように実装されている場合、これは異なるコンパイラ/言語バージョンで同じになると数えることができますか:

self = [super init];
if (self) {
//..
}
return self
4

1 に答える 1

2

本当にいつでも保証することはできません。メソッドinitの実装には、割り当てたメモリを破棄し、(渡されたパラメータに基づいて) より適切なものに置き換える権利があります。試してみると、NSArrayさまざまなアドレスが返される可能性があります (クラス クラスターとして実装されているものはすべて、これに最適な候補です)。


あなたの編集から、superまったく同じことができます。それがあなたが書く理由です:

self = [super init];

したがってsuper、割り当てられたメモリが変更された場合、self参照は新しい割り当てを指すように更新されます。

いいえ、SDK の異なるバージョン間で同じであることを保証することはできません。

于 2013-08-23T10:06:38.947 に答える