他の人が指摘したように、表示する 2 つのコード スニペットは同等ではありません (メモリ管理上の理由から)。後者よりも前者が選ばれる理由については、次のとおりです。
後者の正しい定式化は次のようになります。
self.aController= [[[AController alloc] init] autorelease];
前者と比較すると、自動解放プールの使用により追加のオーバーヘッドが追加され、状況によっては (自動解放プールが解放されるまで) オブジェクトの有効期間が不必要に延長され、アプリケーションのメモリ フットプリントが増加します。
他の「可能な」実装 (例がどこからのものかによる) は単純です:
aController = [[AController alloc] init];
ただし、インスタンス変数を直接設定することは、init メソッドまたは dealloc メソッド以外では絶対にお勧めできません。それ以外の場合は、常にアクセサー メソッドを使用する必要があります。
これにより、サンプル コードに示されている実装が表示されます。
AController *tempAController = [[AController alloc] init];
self.aController = tempAController;
[tempAController release];
これは、次の理由からベスト プラクティスに従います。
- 自動解放を回避します。
- これにより、メモリ管理のセマンティクスがすぐに明確になります。
- アクセサー メソッドを使用してインスタンス変数を設定します。