メソッドを使用してオブジェクトを作成しました。alloc/init
リリース後、-dealloc
ドキュメントに従ってすぐに呼び出す必要があります。メソッドにブレークポイントを設定しました-dealloc
が、ヒットせず、-dealloc
メソッドが呼び出されません。
その背後にある理由と、目的 c での dealloc メソッドの使用は何ですか?
メソッドを使用してオブジェクトを作成しました。alloc/init
リリース後、-dealloc
ドキュメントに従ってすぐに呼び出す必要があります。メソッドにブレークポイントを設定しました-dealloc
が、ヒットせず、-dealloc
メソッドが呼び出されません。
その背後にある理由と、目的 c での dealloc メソッドの使用は何ですか?
メソッドは、-dealloc
呼び出されると予想されるときに常に呼び出されるとは限りません。-retain
ランタイムは、内部的な理由でオブジェクトに対して を発行した可能性もあります。
また、(直接的または間接的に) エクストラ-retain
が発行された可能性もあります。保持/割り当てと解放のバランスが取れていない場合、-dealloc
呼び出されることはありません。Static Analyzer をオンにすると、通話のバランスが取れていることを確認できます。
メモリ管理ルールに従い、実行時間を推測せず、メモリ管理システムに任せてください。
dealloc メソッドが呼び出されるのはいつですか?への回答 あなたが見ているものを理解するのに役立つかもしれません。
まだ参照があるためです。これは、参照カウントがゼロに達していないことを意味します。あなたのコードがどこを参照しているのかわかりません。しかし、それはどういうわけかまだ参照を持っていることを意味する呼び出しではありません。それは強い関係や親子関係によるものかもしれません
すべての Objective-C オブジェクトはヒープに割り当てられるため、リソースが不足しないようにするには、どこかで割り当てを解除する必要があります。
これは、今日でも使用されている参照カウント方法に取って代わられました。各オブジェクトは、保持されているすべての参照のカウントを保持します。オブジェクトを受け取り、それを保持したい場合は、そのオブジェクトを保持し、その参照カウントを増やします。使い終わったら、それを解放します。これにより、参照カウントが減少します。そのカウントがゼロになると、誰もオブジェクトを参照していないと推測され、-dealloc メソッドを使用して自動的に割り当てが解除されます。
さらに、自動解放プールを使用して、オブジェクトに「(できれば) 近い将来のある時点で解放する」ように指示することもできます。スタックのどこか (通常はスレッドの開始時または入力イベントへの応答中) に自動解放プールが作成され、スタックにプッシュされるという考え方です。その後、任意のオブジェクトに -autorelease メッセージを送信でき、そのオブジェクトがそのプールに割り当てられます。
プール オブジェクトの割り当てが解除されると、割り当てられたすべてのオブジェクトに -release メッセージが送信されます。このようにして、使用されなくなったオブジェクト (つまり、明示的に保持されていないオブジェクト) の割り当てが解除されます。
dealloc
オブジェクトが解放されるたびに、(多くの場合) が呼び出されます。このメソッドを直接呼び出すことはできません。
@interface myViewController:UIViewController
{
NSString *myStr;
}
@end
ここでdealloc
@implementation のメソッドはmyViewController
(ほとんどの場合)が解放されmyViewController
たときではなく、オブジェクトが解放されたときに呼び出さmyStr
れます。
ARCの場合は使用する必要はありませんが。