1

NSTimeIntervallとNSDateで奇妙なメモリリークが発生しました。これが私のコードです:

NSTimeInterval interval = 60*60*[[[Config alloc] getCacheLifetime] integerValue];
NSDate *maxCacheAge = [[NSDate alloc] initWithTimeIntervalSinceNow:-interval];

if ([date compare:maxCacheAge] == NSOrderedDescending) {
    return YES;
} else {
    return NO;
}

dateは単なるNSDateオブジェクトであり、これで問題ありません。Instrumentsは、「間隔」がリークすることを教えてくれますが、これを完全には理解していません。どうすれば非オブジェクトを解放できますか?ここに投稿したコードスニペットの後で関数が終了するので、私の理解から、間隔は自動的に割り当て解除されるはずです。

どうもありがとう!

4

2 に答える 2

4

おそらく、その回線でリークが発生していることを示しています。

表現[[[Config alloc] getCacheLifetime] integerValue]はあなたの問題です。

まず、オブジェクトの作成(呼び出し)に関心がありますが、またはallocを呼び出す前にオブジェクトへの参照が失われるため、リークが発生します。releaseautorelease

initまた、オブジェクトを割り当てた直後にメソッドを呼び出す必要があります。Configクラスが特別なことを何もしない場合でも、NSObjectinitメソッドを呼び出す必要があります。

その行を次のように置き換えると

Config *config = [[Config alloc] init];
NSTimeInterval interval = 60*60*[[config getCacheLifetime] integerValue];
[config release];

その漏れを塞ぐ必要があります。

また、オブジェクトをリークしていmaxCacheAgeます。ifステートメントの前に挿入[maxCacheAge autorelease];すると修正されます。

于 2010-01-16T20:51:52.193 に答える
0

問題が見つかりました。同じ問題が発生した場合、これが解決策です。

[[ClubzoneConfig alloc] loadConfigFile];
NSTimeInterval interval = 60*60*[[[ClubzoneConfig alloc] getCacheLifetime] integerValue];
NSDate *maxCacheAge = [[NSDate alloc] initWithTimeIntervalSinceNow:-interval];

if ([date compare:maxCacheAge] == NSOrderedDescending) {
    [maxCacheAge release];
    return YES;
} else {
    [maxCacheAge release];
    return NO;
}

問題は、私が所有しているmaxCacheAgeオブジェクトを解放する必要があることです(以下のリンクを参照)。

私はここで素晴らしいソリューションのおかげでそれを手に入れました:iPhoneメモリ管理

于 2010-01-16T20:51:16.547 に答える