NSURLCache падает с автоматически выпущенными объектами, но протекает иначе - PullRequest
5 голосов
/ 29 января 2010

CSURLCache предназначен для кэширования ресурсов для автономного просмотра, так как NSURLCache хранит только данные в памяти.

Если cachedResponse автоматически освобожден до возврата приложения, происходит сбой, если нет, объекты просто просочились.

Любой свет, который мог бы пролиться на это, был бы очень признателен.

Обратите внимание, stringByEncodingURLEntities - это метод категории 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

ОБНОВЛЕНИЕ : После отправки радара в Apple выясняется, что это известная проблема (Radar # 7640470).

1 Ответ

1 голос
/ 29 января 2010
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

Ну, это не метод alloc, new или copy ...

… и CSURLCache нигде не держится за объект, поэтому ему не принадлежит.

Итак, вам нужно автоматически выпустить его.

Конечно, это означает, что объект обречен, если что-то его не удержит. Ваше приложение упало, потому что оно пыталось использовать объект после смерти объекта.

Запустите ваше приложение в разделе Инструменты с шаблоном Зомби. Посмотрите, где происходит сбой приложения и что оно делает, когда вызывается cachedResponseForRequest:. Вызывающая сторона должна владеть объектом до того момента, когда в противном случае произойдет сбой приложения, а затем освободить его.

...