1

NSDate オブジェクトの割り当てが時期尚早に解除されるという問題がたくさんあります。問題は、NSDate コンビニエンス メソッドから返されたオブジェクトを処理する方法に関連している可能性があると思われます。JKShow クラスの showDate プロパティ宣言は「保持」する必要があると思いますが、割り当てまたはコピーに変更しても問題には影響しないようです

JKShow *show; 
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];

// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

アップデート

問題は、ここにコピーされたコードにはありませんでした。私の方法では、便利な方法JKShow initから返された日付を保持していませんでした。NSDate助けてくれてありがとう、みんな。

4

4 に答える 4

2

dateFromComponents から返される日付は autorelease プールにある必要があるため、showDate プロパティを「保持」する必要があるのは正しいことです。実際、とにかくそうすべきです(特に「コピー」が必要でない限り)。

あなたが示したコードから、ショーオブジェクトの所有権を完全にリストに与えているように見えます(追加するときに自動解放を設定しているため)。ショー オブジェクトがリストから出てくる前に、日付オブジェクトの割り当てが解除されている (またはリストの割り当てが解除されている) ということですか?

また、合成されたプロパティを使用していますか、それとも手動で記述していますか? 後者の場合、setShowDate プロパティ メソッドはどのようなものですか?

また、さまざまな場所で日付オブジェクトのretainCountをログに記録することもできます(ただし、自動解放が実際にそれを複雑にしていることは常にわかっています)。

于 2008-11-01T18:03:48.213 に答える
2

showDate が保持プロパティである場合、投稿したコードを考えると十分です。他の何か (おそらく JKShow の実装) が正しくない可能性があります。

何が起こっているのかを把握したい場合は、Instruments を使用してオブジェクトの寿命を調べることができます。保持と解放を記憶するには、割り当てツール セットを使用して実行する必要があります。デフォルトでは、leaks パフォーマンス ツールを実行すると、そのように設定されます。

このように Instruments を実行すると、すべてのオブジェクトの有効期間と、それらに対して発行されたすべての保持およびリリースのバックトレースが記録されます。オブジェクトを調べて、日付の 1 つを見つけ、すべての保持とリリースを調べると、偽のリリースがどこで発生しているかを判断できるはずです。

于 2008-11-01T18:10:26.140 に答える
0

すべての助けに感謝しますが、問題は私がここに投稿したコードの外にありました。NSDateinit メソッドで作成したものを保持していませんでした。残念ながら、2 つの新しいオブジェクトを作成するまでクラッシュは発生しなかったNSDateため、完全に間違ったツリーを作成していました。

于 2008-11-01T19:21:09.850 に答える
0

あなたが示したコードには、早期リリースの問題はありません。実際、配列を解放しないため、配列とその中のすべてをリークします。

ガベージコレクタをオンにして実行していますか?

インスタンス変数ですかlist、静的変数ですか、それともローカル変数ですか?

于 2008-11-01T18:35:35.433 に答える