0

私は奇妙な状況にあり、誰かが光を当ててくれることを願っています。カスタム オブジェクトにプロトコルを実装していNSCodingますが、 でメモリ リークが発生していinitWithCoder:ます。私はこのようなものを持っています:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
if(titleTemp) {
    [self setTitleString:titleTemp];
} else {
    [self setTitleString:[NSString string]];
}

このオブジェクトには他にも多くのプロパティがあり、配列、文​​字列、プリミティブ (double、int) などがありますが、このメソッドでは一貫してメモリ リークが発生しています。decodeObjectForKey:インスツルメンツは、ライン上の各デコードでリークが発生することを教えてくれます。10 個以上のオブジェクトの配列内の各カスタム クラス内のすべてのデコードされたオブジェクトをリークすると、メモリが増加し始めます。

しかし、本当に困惑したのは、このコードの出力:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
NSLog(@"%i", titleTemp.retainCount);

は「3」です!

うわー、それらのすべての保持はどこから来ているのですか? 私を殴る。しかし、これらすべてのリークについて知りたいです。ありがとう!

4

2 に答える 2

2

うわー、それらのすべての保持はどこから来ているのですか?

保持を行っているコードが見えないとは言い難いですが、それがあなたのコードでない限り、心配する必要はありません。文字列を作成するために他のいくつかのメソッドを実際に呼び出す可能-decodeObjectForKey:性は十分にあり、それらのいずれかがその文字列を保持し、その後自動解放する可能性があります。

私を殴る。しかし、これらすべてのリークについて知りたいです。

を使用してリークを見つけようとする代わりに-retainCount、リークされたオブジェクトを調べます。楽器はそれを助けることができます。これらのオブジェクトの保持 (もちろん、割り当て、コピー、および新規) とリリースのバランスをとっていることを確認してください。オブジェクトを保持しすぎたり解放しすぎたりすると、リークが発生します。コントロール外のコードがそれを実行している場合、とにかくそれに対してできることはあまりありません。

于 2012-02-20T05:56:23.540 に答える
2

これを読んでください: http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ . 彼は正しい。これが意味することは、によって返される値を無視しながら、Cocoa のメモリ管理規則に従う必要があるということですretainCount。あなたreleaseまたはautoreleaseあなたが所有している各オブジェクトを確認しinitてください. さらに、リリース/自動リリースは、所有する参照とバランスを取る必要があります。したがって、オブジェクトを一度保持すると、一度しか解放できません。newcopymutableCopy

この特定のケースでは、投稿した小さなスニペットに問題があるようには見えません。ただし重要な点は、retainCount を使用してデバッグするべきではないということです。

于 2012-02-20T05:53:15.913 に答える