質問

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

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

他のヒント

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

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

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

日付オブジェクトのretainCountをさまざまな場所で記録してみることもできます(ただし、自動リリースはそれを本当に複雑にしますが)。

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

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

そのようにInstrumentsを実行すると、すべてのオブジェクトの寿命と、それらに対して発行されたすべての保持およびリリースのバックトレースが記録されます。オブジェクトを調べて、日付の1つを見つけ、すべての保持およびリリースを確認すると、偽のリリースが発生している場所を特定できるはずです。

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

ガベージコレクターを有効にして実行していますか

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top