ARC を使用しているかどうかによって、2 つのまったく異なる答えがあります。ARC環境は非常に単純なので、ARC以前の観点からお答えします。理解しておくべき主なことは、プロパティ保持セマンティクスに関するすべての話は、主なポイントから気を散らすだけだということです。所有権の放棄は、 を介して行われ-release
ます。では、「所有権を取得するとはどういうことか」を理解する必要があります。
new
慣例により、[ 、alloc
、retain
、 ]のいずれかを含むクラスにメッセージを送信すると、copy
そのオブジェクトの所有者になります。コンパイラは、指定した所有権ポリシーに応じて、Objective C プロパティのセッター メソッドを生成します。例えば...
@property (..., retain) NSMutableArray *myArray;
@synthesize myArray = _myArray;
これにより、次のようなメソッドが生成されます1 :
- (void)setMyArray:(NSMutableArray *)myArray
{
// This is oversimplified, just to illustrate the important point.
// Again, this is NOT the way a setter would actually be synthesized.
[_myArray release];
_myArray = [myArray retain];
}
したがって、 のようなことを言うとself.myArray = someArray
、保持メッセージを に送信したことがわかり、someArray
後でそれを解放する責任があります。これを行う理想的な方法はself.myArray = nil
、保持する前に古い値を解放するためnil
です。myArray
プロパティに何も設定していない場合でも、メッセージを送信しても問題ないため、そのメッセージを送信しても完全に安全であることに注意してくださいnil
。そのため、使用方法に関係なく、使用済みのプロパティを常にに設定するのが一般的です。nil
1アクセサーが実際にどのように機能するかについては、この記事を参照してください。