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.