2010-12-10 8 views
0

私はws_data変数をself.ws_dataを使って値を代入して、私がws_dataだけを使うのではなく、このコードで私がメモリリークを起こす理由を理解する必要があります。なぜ "self"で設定値がメモリリークを引き起こすのですか?

self.ws_dataはのdeallocにリリース@property(コピー)NSStringの*、です。

dispatch_queue_t ws_queue = dispatch_queue_create("ws check win", NULL); 
dispatch_async(ws_queue, ^{ 
    self.ws_data = [[NSString alloc]initWithContentsOfURL:url]; 
}); 
dispatch_release(ws_queue); 

ありがとうございます!

答えて

2

self.variableNameは、そのアクセサを通じて変数にアクセスします。 ws_data NSStringはプロパティ宣言にコピーに設定されているため、その宣言で設定すると文字列は保持されます。

自己を使用していません。は、それらのアクセサを経由せずにivarを参照します。また、変数がコピーされていないことを意味します。したがって、変数への参照が消えると(メソッドの終了時など)変数は消えます。

あなたはコピーが必要ですか?完了したら、deallocで行うのと同じように、リリースするだけです。

あなたはこのアクセス第二の保持を作り、どこか別の場所にそれを保持していますか?

+0

いいえ、どこにも保持しません。 – MatterGoal

1

私が正しく物事を理解する(と私はすべての非常に長いためのiOS開発をやっていませんでしたと私は恐らくない)この例では、プロパティにコピー属性を使用しているとして、場合、何あなたがself.ws_dataを使うときには、既に確保されているNSStringのcopyメソッドを呼び出すことになります。これは、保持カウント1のNSStringの別のインスタンスを作成しています。

しかし、元NSStringのは(それがあなたの上記のサンプルでallocedされています)、したがって、任意の時点で漏れがリリースされていません。

あなたが使用することができます...

self.ws_data = [[[NSString alloc]initWithContentsOfURL:url] autorelease]; 

は...その代わり、私が考えていると思います。

関連する問題