14

NSMutableArray幸せなオブジェクトの配列があります。これらのオブジェクトは、すべてのオブジェクトの配列をクリアして再入力しようとするたびに、悪意を持ってオン(リーク)します。

このようにinit関数に割り当てられます

self.list = [NSMutableArray array];

私がそれをクリアするために使用したさまざまな方法は次のとおりです。

self.list = nil;
self.list = [NSMutableArray array];

[self.eventList removeAllObjects];

アレイを明示的に割り当てたり解放したりすることもできません。リークは、リストをリセットしようとしたときにのみ発生します。

リセットするときにステップが欠落していますか、それともこれは別の問題ですか?

4

5 に答える 5

8

漏れているオブジェクトをどのように作成しましたか? 次のようなことをした場合:

- (void)addObjectsToArray {

    [list addObject:[[MyClass alloc] init];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
}

リストの割り当てが解除されると、2 つのオブジェクトがリークします。

そのようなコードは次のものに置き換える必要があります。

- (void)addObjectsToArray {

    MyClass *myObject = [[MyClass alloc] init];
    [list addObject:myObject];
    [myObject release];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
    [anotherObject release];
}

さらに詳細に:

最初のパターンに従えば、所有するCocoa メモリ管理ルールに従って 2 つのオブジェクトを作成したことになります。所有権を放棄するのはあなたの責任です。そうしないと、オブジェクトの割り当てが解除されず、リークが発生します。

ただし、オブジェクトを配列に渡し、オブジェクトの所有権も取得するため、すぐにリークが発生することはありません。リークは、配列からオブジェクトを削除するか、配列自体の割り当てが解除された場合にのみ認識されます。これらのイベントのいずれかが発生すると、配列はオブジェクトの所有権を放棄し、オブジェクトはアプリケーション内で「ライブ」のままになりますが、それらへの参照はありません。

于 2008-10-10T04:13:29.763 に答える
6

配列リーク内のオブジェクトについて言及していますか?

配列にオブジェクトをどのように追加していますか? 配列はそれらを保持するため、配列に追加した後にそれらを自動解放または解放する必要があります。そうしないと、配列が解放された後もオブジェクトが保持されます (リークされます)。

MyEvent *event = [[MyEvent alloc] initWithEventInfo:info];
[self.eventList addObject:event];
[event release];

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];
于 2008-10-07T19:08:42.907 に答える
4

あなたの@property宣言はどのように見えますか?アクセサーを合成していますか?もしそうなら、あなたが必要@property(retain)です。オブジェクトがあなたをオンにしていると言ったとき、あなたはコアダンプを参照していると思います(EXC\_BAD\_ACCESS)

于 2008-10-07T18:13:04.157 に答える
0

私はあなたに素晴らしい答えを与えるのに十分な情報をここに持っていないと思います. はまだ割り当てられてNSMutableArrayいますが、空でオブジェクトはありませんが、以前に配列にあったオブジェクトは、アプリのその時点で割り当てを解除する必要がありますが、まだ割り当てられていると言っていますか?

その場合、配列は空である可能性がありますが、オブジェクトは送信された dealloc メッセージを処理していません。この場合、オブジェクトはまだメモリ内にありますが、何からも参照されていません。

MallocDebugが正確に何をリークしていると言っているのかを正確に知りたいのですが。また、@Elfred は、配列のメソッドをチェックする際にいくつかの良いアドバイスを提供しています@property。実際には、保持またはコピーする必要があります。

于 2008-10-07T19:41:52.153 に答える
0

リストをリセットしようとしたときにのみリークが発生する場合は、解放しようとした他のオブジェクトを誰か/何かが使用しています。

于 2008-10-09T22:05:28.413 に答える