0

このシナリオを理解するのにいくつかの困難があります。

  • オブジェクトを作成します
  • その保持プロパティを何かに設定しました
  • プロパティを解放するのを忘れています
  • オブジェクトを解放します

dealloc メソッドでプロパティを解放しなかったため、このシナリオではメモリ リークが発生しますか、それともプロパティは自動的に解放されますか?

4

2 に答える 2

0

Cocoa の仕組みは、メモリ管理が常に1 つのメソッド内でローカルにバランスが取れているように見えることです*。これがポイントのようなものです。メソッドを見ただけで、メソッドにリークやエラーがあるかどうかを判断できるはずです。グローバルなプログラムの知識は必要ありません。

-copy、-alloc、-retain、または -new メソッドからオブジェクトを受け取った場合、オブジェクトを解放するのはユーザーの責任です。

これを行う場合:

[obj setProp:foo];

fooを解放するのはあなたの責任ですか?いいえ - ルールを参照してください。obj がそれを保持している場合 (そして、たまたまそれが保持されていることを知っていると言っている場合)、それを解放するのは obj の責任です。

ですから、こうすればどんな物件でもバランスが取れています-prop

id obj = [[MyObject alloc] init];
[obj setProp:foo];
[obj release];

*init、copy、dealloc、およびアクセサ メソッドの実装内を除きます。

于 2010-04-07T09:07:23.793 に答える
-1

はい、漏れです。

Retain, alloc はカウンターを 1 増やします。離すとカウンターが減少します。カウンターがゼロになると、メモリが解放されます。

セッターは次のように考えてください。

[newvalue retain];
[property release]; 
property = newvalue;

そう..

  • オブジェクトを作成 => 0+1=1
  • 保持プロパティとしてオブジェクトに割り当てる => 1+1=2
  • オブジェクトを解放する => 2-1=1

いつかそのオブジェクトを再びリリースする必要があります。autoreleaseそして、 iPhone 環境ではうまく動作しないことを信じてください。

于 2010-04-07T07:36:39.977 に答える