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.