/ / NSURLCache se bloquea con objetos lanzados automáticamente, pero se filtra de otro modo: object-c, cocoa, autorelease, nsurlcache

NSURLCache se bloquea con objetos lanzados automáticamente, pero tiene fugas de lo contrario: object-c, cocoa, autorelease, nsurlcache

CSURLCache está diseñado para almacenar recursos en caché para la navegación fuera de línea, como NSURLCache solo almacena datos en memoria.

Si cachedResponse se lanza automáticamente antes de devolver los bloqueos de la aplicación, si no, los objetos simplemente se filtran.

Cualquier luz que pudiera arrojarse sobre esto sería muy apreciada.

tenga en cuenta stringByEncodingURLEntities es un método de categoría en 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

ACTUALIZAR: Después de enviar un radar a Apple, parece que este es un problema conocido (Radar # 7640470).

Respuestas

1 para la respuesta № 1
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

Bueno, esto no es una alloc, new, o copy método…

... y CSURLCache no se aferra al objeto en ninguna parte, por lo que no lo posee.

Por lo tanto, necesita autorelease

Por supuesto, eso significa que el objeto está condenado a menos que algo lo retenga. Su aplicación se bloqueó porque intentó usar el objeto después de que el objeto murió.

Ejecute su aplicación en Instrumentos con la plantilla Zombies. Mira dónde se bloquea la aplicación y qué estaba haciendo cuando cachedResponseForRequest: fue llamado. La persona que llama debe poseer el objeto hasta el momento en que la aplicación se bloquearía de lo contrario, y luego liberarlo.