5

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 にレーダーを送信したところ、これは既知の問題であることがわかりました (レーダー #7640470)。

4

1 に答える 1

1
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

まあ、これは、、、またはメソッドではありませんallocnew< copy/ p>

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

したがって、自動リリースする必要があります。

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

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

于 2010-01-29T01:16:55.223 に答える