2011-08-20 13 views
3

可能な重複必要:
check retain count保持/解放カウントの問題。明確化が

私はretainreleaseカウントで遊んでいたので、私は状況に走ったが、私が説明することはできませんよ。

  • クラスOがあります。変数を含んでおらず、何もしません。
  • クラスCountがあります。それは、Oと増分を初期化し2個のボタンを備えたUIのペン先があり
  • それのためにカウントをデクリメント:すべてのdoRetainについては

enter image description here

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    o = [[O alloc]init]; // At this moment [o retainCount] is 1 as expected 
    .... 

を保持し、リリース、

期待通りの増分をカウント
- (IBAction)doRetain:(id)sender { 
    [o retain]; 

    NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];  
    [label setText: result]; 
    [result release]; 

} 

リリースが呼び出されるたびに、カウントが減少します

- (IBAction)doRelease:(id)sender { 
    [o release]; 

    NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]]; 
    [label setText: result]; 
    [result release]; 

} 

は2に上がるマニュアルが続く

  • は、カウントを保持アロケーションのinitシーケンスの後、1が保持し2つのリリース

    我々は1の保持カウントを始める

    enter image description here

    1. 考えてみましょう
    2. 次に、カウントを減らして1に下がります。
    3. h次の減少.....一見何もしません保持カウントはまだ1です
    4. このリリースは、悪いメモリを参照し、アプリケーションをクラッシュします。

    あなたは本当に[retainCount]機能を使用しないでください他の最近の記事に述べたように、私は、この動作

  • 答えて

    4

    、オブジェクトは、もはや有効ではない、とreleaseCountプロパティが無意味である(との結果は予測できません)。

    また、これはテストですが、あなたの文字列を 'alloc'で作成しますが、決して解放しないでください。

    リリースと保有に関する作業を行う場合は、自分の保有する保有物のリリースのみ責任を負います。他のオブジェクトは、問題のオブジェクトに対して保持を実行し、次にそれらを解放します。

    alloc,copyまたはcreateという語を含むメソッドを使用してオブジェクトを取得した場合、そのオブジェクトに暗黙のretainが含まれています。それ以外の場合は、現在の実行ループの後にオブジェクトがなくなることを前提とすることができます。そのため、オブジェクトのコピーにハングアップする場合は、保持を実行する必要があります。オブジェクトが終了したら、リリースしてください。

    +0

    これは理にかなっています。ありがとうダグ – JAM

    1

    を理解する助けてください!あなたの保持カウントが1であり、あなたが解放した場合

    check retain count

    +0

    さて、あなたの保持カウントをどのように把握していますか? – JAM

    +1

    あなたはしません。まず、メモリを正しく管理します。 – jtbandes

    +1

    私はあなたのアプリケーションのためにそれらを使うべきではないことに同意しますが、どのように動作するかを理解するのに便利です。そして、@ mac - インスタンスを解放するかどうかを決定するために保持カウントを使用することは決してありません。私は私の答えを詳しく説明します。 –

    2

    実際、保持カウントはひどく誤解を招くデータであり、恐ろしい学習ツールです。場合は保持カウントが期待した値であることに数えることができる唯一の時間です:あなたがNSObjectののサブクラスを作成(または、独自のルートクラスを作成します)

    • に任意のをあなたのオブジェクトを渡しませんシステムAPIのすべての

    • は使用しませんautoreleaseこれまで

    これらのルールのいずれかがに違反した場合、保持カウントは、その値があなたのコントロールを超えた実装の詳細になります。確かに、単純なケースでは比較的一貫性があります。そうでなければ、間違ったツールを使って誤った前提に基づいて何かをデバッグすることになります。

    I.e.

    retainCountを呼び出さないでください!

    cocoa memory management guideは、保持とリリースの管理方法を正確に定義しています。

    リテンションカウントをデルタとして扱う必要があります。操作はそれを変更しないままにするか、変更を増減します。それを増加させる場合は、所有権を放棄するために減らす必要があります。絶対値は重要ではありません。