プロパティの実装にはリークはなく、ARCを使用している限り、プロパティに割り当てる場所もありません。通話
:旧プロパティが保持しているオブジェクトが解放され
- (void)setMyProperty:(MyClass *)anInstance
{
if (_myProperty == anInstance)
return;
[_myProperty release];
_myProperty = [anInstance retain];
}
:
self.myProperty = something
はこのような何かを行く生成されたアクセサを呼び出すには(_myProperty
と仮定すると、あなたの財産のバッキングIVARです)ので、ここでは漏れません。また、ARCを使用している場合、コンパイラによって生成されたコードは同じように動作します。
あなたが疑っている場所ではありませんが(あなたが知る限りは)、漏れの可能性に注意するのは間違いありません。
self.myProperty = [[MyClass alloc] initWithBla:bla blur:blur];
これは+1の保持カウントを持つ新しいオブジェクトを作成し、(再度、それを保持する:+2)プロパティに割り当て。だから、あなたのコードはまだそのオブジェクトへの所有権参照を持っています。その行を繰り返すと、まだ所有している最初の参照が孤立してしまいました.ARCを使用している場合、オブジェクトは解放されます。そうでなければ、その孤立したオブジェクトはまだ保持されています。本当に漏れがあります。適切なARCでないことは次のようになります。
self.myProperty = [[[MyClass alloc] initWithBla:bla blur:blur] autorelease];
しかし、ARCを使用すると、あなたはうまくいきます。
は、コメントから、関連の質問に対処するために:これはまだ大丈夫です - しかし、唯一のARCの下に - あなたは
self.myProperty
に代わりのローカル変数に代入している場合。あなたが書くとき:
id myLocalVar;
myLocalVar = [[MyClass alloc] initWithBla:bla blur:blur];
myLocalVar = [[MyClass alloc] initWithBla:bla blur:blur];
コンパイラは変換します:
__strong id myLocalVar; // variables are strong by default
myLocalVar = [[MyClass alloc] initWithBla:bla blur:blur];
[myLocalVar release]; // ARC inserts release before myLocalVar is reassigned to another object
myLocalVar = [[MyClass alloc] initWithBla:bla blur:blur];
// ... sometime later ...
[myLocalVar release]; // ARC inserts another release when myLocalVar goes out of scope
素敵に答える説明! +1。 –
@rickster ARCを使用していてオブジェクトがローカルで2回初期化されたらどうなりますか? –
編集された回答を参照してください。保持カウントを増やす(そして、ARCが 'release'sのバランスを取って挿入する)オブジェクトを' init'するのではなく、 'alloc'を使うことに注意してください。 – rickster