4

私はと機能的に同等であるコードの部分を持っている:上に示したように私は実際には2回連続でこれをやっていないよallocはARC Objective Cで2回目のプロパティのinit'ingによってメモリリークを起こしますか?

self.myProperty = [[MyClass alloc] initWithBla:bla blur:blur]; 
self.myProperty = [[MyClass alloc] initWithBla:bla blur:blur]; 

が、それが起こっている事実です。私の質問は、これはARC Objective Cの下でメモリリークを引き起こしますか? self.myPropertyが新たに割り当てられたインスタンスMyClassを指すように再割り当てされる前に、最初の呼び出しで割り当てられたメモリがself.myPropertyに割り当てられていますか?

答えて

2

メモリリークはありません。それがARCの全ポイントです。

11

プロパティの実装にはリークはなく、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 
+0

素敵に答える説明! +1。 –

+0

@rickster ARCを使用していてオブジェクトがローカルで2回初期化されたらどうなりますか? –

+0

編集された回答を参照してください。保持カウントを増やす(そして、ARCが 'release'sのバランスを取って挿入する)オブジェクトを' init'するのではなく、 'alloc'を使うことに注意してください。 – rickster

関連する問題