/ / NSURLCacheは自動解放されたオブジェクトでクラッシュしますが、それ以外の場合はリークします - Objective-C、Cocoa、自動解放、nsurlcache

NSURLCacheは自動リリースされたオブジェクトでクラッシュしますが、そうでなければリークします - objective-c、cocoa、autorelease、nsurlcache

CSURLCache オフライン閲覧用にリソースをキャッシュするように設計されています。 NSURLCache データをメモリに格納するだけです。

もし cachedResponse そうでない場合、オブジェクトは単純にリークされます。

これに当てることができるどんな光でも大いに感謝されるでしょう。

ご注意ください stringByEncodingURLEntities のカテゴリメソッドです NSString.

@interface CSURLCache : NSURLCache {} @end

@implementation CSURLCache

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[[[request URL] absoluteString] stringByEncodingURLEntities]];

if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL]
MIMEType:nil
expectedContentLength:[data length]
textEncodingName:nil];

NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response
data:data];
[response release];
[data release];

return cachedResponse;
}

return nil;
}

@end

更新:Appleにレーダーを送信した後、これは既知の問題であると思われます(Radar#7640470)。

回答:

回答№1は1
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

まあ、これはそうではありません alloc, new、または copy 方法…

…そしてCSURLCacheはどこにもオブジェクトを保持しないので、それを所有していません。

それで、あなたはそれを自動解放する必要があります。

もちろん、それは何かがそれを保持しない限りそのオブジェクトが運命づけられていることを意味します。オブジェクトが死んだ後にオブジェクトを使用しようとしたため、アプリがクラッシュしました。

Zombiesテンプレートを使用してInstrumentsの下でアプリを実行します。アプリがクラッシュした場所とそのときに何をしていたかを確認します。 cachedResponseForRequest: と呼ばれていました。呼び出し側は、アプリケーションがクラッシュするまでオブジェクトを所有してから解放する必要があります。