2011-07-08 6 views
2

Instrumentsが検出したリークを修正する際に問題が発生しています。私はNSCalendardateByAddingComponents:toDate:options:メソッドを使ってループ内の日付を減らそうとしており、NSDate個のオブジェクト(正確には49個)のリークが続いています。私はいくつかの異なる方法で、このリークを修正しようとしたが、それは最初の場所で漏れた理由を私は理解していないとして、私は本当に持っているループ内の日付を減らしながらリークする

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
// Get current date 
NSDate *date = [NSDate date]; 
// Create an NSDateComponents object that will be used to decrement the date 
NSDateComponents *decStep = [[NSDateComponents alloc] init]; 
[decStep setDay:-1]; 

for (NSUInteger i = 49; i >= 0 ; i--) 
{ 
    // Insert the date object in an array 
    [self.fooArray insertObject:date atIndex:0]; 
    // Decrement the date 
    date = [gregorian dateByAddingComponents:decStep toDate:date options:0]; 
} 

// Release calendar and date components objects 
[decStep release]; 
[gregorian release]; 

:ここ

は私のコードは次のようになります私が何をしているのか分かりません。 NSAutoreleasePoolを使用しないことを望んでいることを知って、この問題を解決するのに役立つ手がかりはありますか?

答えて

1

なぜあなたは漏れていると思いますか?もしあなたが現在50個のより多くの日付オブジェクトを持っていることをInstrumentが報告しているのなら、それは本当です。 self.fooArrayを何か他のものに設定するまで、それらは保持されます。その時点で(セッターを使用する場合)、それらは解放されます。

+0

まあ、あなたは両方とも正しい!漏れは、日付からではなく、配列から来ていた。 'self.fooArray'はcopyの代わりにretainと宣言され、コピーするように変更した後、一時配列を使用して、' self.fooArray = tpmArray'の後に解放しなければなりませんでした。ありがとう! – Axel

+0

私は、 'NSDate'のファクトリメソッド' date'を使っていて、 'date'変数を再利用していたという事実は私に間違った方向に見えていたと思います。 – Axel

0

メモリリークはありません。 fooArrayには50の日付があります。その配列は50個のオブジェクトです。それは漏れではありません。

0
  1. 日付を配列に追加しています。
  2. 私はdateByAddingComponents:toDate:optionsが新しい日付オブジェクトを作成し、そこにautoreleaseを呼び出していると思います。これらのインスタンスを取り除くには、NSAutoReleasePoolが必要です。
関連する問題