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:
と呼ばれていました。呼び出し側は、アプリケーションがクラッシュするまでオブジェクトを所有してから解放する必要があります。