0

Objective-C のメモリ管理に問題があります。オブジェクトを割り当て、このオブジェクトへの参照をクラスのメンバーとして格納するメソッドがあるとします。同じ関数を 2 回実行する場合は、新しいオブジェクトを作成して置き換える前に、この最初のオブジェクトを解放する必要があります。関数の最初の行が次のようになっているとします。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

これは、別の自動解放プールが配置されることを意味します。オブジェクトを割り当てるコードは次のとおりです。

if (m_object != nil)
    [m_object release];

m_object = [[MyClass alloc] init];
[m_object retain];

問題は、メソッドの最後の行を実行するとプログラムがクラッシュすることです。

[pool release];

私は何を間違っていますか?どうすればこれを修正できますか?

よろしく
アラン

4

2 に答える 2

2

まず、目的の c メモリ管理の一般的な理解を得ます。ここでは、さまざまなことを混乱させています。たとえば、alloc は既に保持カウントを 1 に設定しているため、m_object を保持する必要はありません。また、通常、オブジェクトを解放するときに AutoReleasePool を解放しません。私が言ったように、メモリ管理のドキュメントを調べてください(実際にはかなり良いです)。

于 2010-03-22T13:19:25.743 に答える
0

自動解放プールは、特に自動解放されたオブジェクトを処理します

例:

[object autorelease];

一部のコードがオブジェクトを自動解放しようとする場合に備えて、プログラムに少なくとも1つのNSAutoreleasePoolが必要です。これが唯一のNSAutoreleasePoolである場合は、プールを解放すると問題が発生する可能性があります。

于 2010-03-22T13:11:54.050 に答える