/ / NSURLCache zawiesza się z obiektami autoreleased, ale przecieki w przeciwnym razie - objective-c, cocoa, autorelease, nsurlcache

NSURLCache zawiesza się z autoreleased obiektów, ale przecieki inaczej - cel-c, kakao, autorelease, nsurlcache

CSURLCache jest przeznaczony do buforowania zasobów do przeglądania w trybie offline, jako NSURLCache przechowuje tylko dane w pamięci.

Gdyby cachedResponse jest automatycznie zwalniany przed zwróceniem awarii aplikacji, jeśli nie, obiekty po prostu wyciekają.

Każde światło, które można by rzucić na to, byłoby bardzo cenne.

Proszę zanotować stringByEncodingURLEntities jest metodą kategorii 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

AKTUALIZACJA: Po przesłaniu radaru do Apple okazuje się, że jest to znany problem (Radar # 7640470).

Odpowiedzi:

1 dla odpowiedzi № 1
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

Cóż, to nie jest alloc, new, lub copy metoda…

… A CSURLCache nigdzie nie trzyma obiektu, więc nie jest jego właścicielem.

Musisz więc automatycznie go opublikować.

Oczywiście oznacza to, że obiekt jest skazany na zagładę, chyba że coś go zatrzyma. Twoja aplikacja uległa awarii, ponieważ próbowała użyć obiektu po jego śmierci.

Uruchom swoją aplikację w obszarze Instrumenty z szablonem Zombies. Zobacz, gdzie aplikacja się zawiesza i co i kiedy robiła cachedResponseForRequest: został wezwany. Obiekt wywołujący musi być właścicielem obiektu do czasu, gdy w przeciwnym razie aplikacja uległaby awarii, a następnie zwolnić go.