2012-05-08 3 views
0

私はXcode 4の初心者です。目的C NSAutoreleasePoolとリリース

最近私はObjective Cプログラムをデバッグしています。

(...私は早くデバッグ時にプールのリリースコードを理解していないので)

-(void) func{ 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    Product *product=(Product *)[appDelegate.productData objectAtIndex:0]; 
    NSLog(product.Name); 
    [product release]; 
    [pool release]; 
} 

面白いことは、私は、製品のリリースを追加したことである:私はこのような関数を書きますプログラムを実行すると、EXC_BAD_ACCESSによって停止します。
製品リリースを削除した後、正常に動作します。
製品オブジェクトがリリースされているかどうかは本当にわかりません。
そして、これがEXC_BAD_ACCESSを作成する主なポイントであるかどうかはわかりません。
だから私はすべてのことを保証するためにこの質問をしたい。それはエラーを作りますか?

答えて

3

Objective Cでは、メモリの取り扱いの概念は非常に単純です - オブジェクトの所有権。 オブジェクトを割り当てる、つまり保持カウントを1増加させる場合、そのカウントを減らすのは私の責任です。

ここでは、製品オブジェクトに新しいメモリを割り当てないので、既存のメモリを参照しているだけです。だからあなたはそれを解放する必要はありません。まあ、私はグーグルで、いくつかの文書を検索し、「それは自動解放することができ、オブジェクトのリリースはEXC_BAD_ACCESSを引き起こします」ことを発見http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html%23//apple_ref/doc/uid/10000011-SW1https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

+0

-

あなたはより多くの自動解放プールの上と中にリリースすることができます。そして、基本的にコード内の製品は、解放する必要のないポインタです。しかし、どのオブジェクトがコード内で自動解放されるかを特定することは非常に難しいことがわかりました。このような状況では、このような事態を防ぐ方法を検討します。このような状況を防ぐために、すべての関数でNSAutoreleaseプールを使用して、手動でリリースを呼び出したり、返されたすべてのオブジェクトでautoreleaseを使用したりすることはできませんか? –