CSURLCache
está diseñado para almacenar en caché los recursos para la exploración sin conexión, ya que NSURLCache
solo almacena datos en la memoria.NSURLCache se bloquea con objetos liberados automáticamente, pero de lo contrario
Si cachedResponse
se libera automáticamente antes de devolver la aplicación se bloquea, si no, los objetos simplemente se filtran.
Cualquier luz que pueda arrojarse sobre esto sería muy apreciada.
Tenga en cuenta que 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
ACTUALIZACIÓN: Después de enviar un radar a Apple parece que este es un problema conocido (radar # 7640470).
¿Estás seguro de que se han filtrado si no se han lanzado de forma automática? ¿Y está seguro de que su programa se bloquea porque intenta liberarlos? Las reglas de administración de memoria indican claramente que usted sería el responsable de liberar ese objeto. – zneak
Sí, definitivamente gotean si no se liberan automáticamente. El programa se bloquea porque se envía un mensaje de retención a un objeto desasignado –