CSURLCache
è progettato per memorizzare nella cache le risorse per la navigazione offline, poiché NSURLCache
memorizza solo i dati in memoria.NSURLCache si arresta in modo anomalo con oggetti autoreleased, ma perde altrimenti
Se cachedResponse
viene rilasciato automaticamente prima di restituire l'arresto anomalo dell'applicazione, in caso contrario, gli oggetti vengono semplicemente trapelati.
Qualsiasi luce che potrebbe essere versata su questo sarebbe molto apprezzata.
Nota: stringByEncodingURLEntities
è un metodo di categoria su 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
UPDATE: Dopo aver inviato un radar ad Apple sembra che questo è un problema noto (Radar # 7.640.470).
Sei sicuro che siano trapelate se non sono autorizzate? E sei sicuro che il tuo programma si blocca perché provi a rilasciarli? Le regole di gestione della memoria affermano chiaramente che saresti tu il responsabile del rilascio di quell'oggetto. – zneak
Sì, stanno perdendo definitivamente se non sono autorizzate. Il programma si arresta in modo anomalo perché viene inviato un messaggio di conservazione a un oggetto deallocato –