Утечка памяти при использовании SDURLCache (подкласс NSURLCache) - PullRequest
3 голосов
/ 08 июня 2010

Я использую SDURLCache Оливье Потрея (ссылка на github) в качестве альтернативы NSURLCache для включения кэширования диска в приложении для iPhone.

Он работает очень хорошо, но с любопытной утечкойNSHTTPURLResponseInternal при возврате кэшированного объекта на диск (нет утечки при возврате объекта из памяти или при отсутствии объекта).В следующем фрагменте кода показано, как SDURLCache читает данные с диска:

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
    NSCachedURLResponse *memoryResponse = [super cachedResponseForRequest:request];
    if (memoryResponse)
    {
        return memoryResponse;
    }

    NSString *cacheKey = [SDURLCache cacheKeyForURL:request.URL];

    // NOTE: We don't handle expiration here as even staled cache data is necessary for NSURLConnection to handle cache revalidation.
    //       Staled cache data is also needed for cachePolicies which force the use of the cache.
    NSMutableDictionary *accesses = [self.diskCacheInfo objectForKey:kSDURLCacheInfoAccessesKey];
    if ([accesses objectForKey:cacheKey]) // OPTI: Check for cache-hit in a in-memory dictionnary before to hit the FS
    {
        NSCachedURLResponse *diskResponse = [NSKeyedUnarchiver unarchiveObjectWithFile:[diskCachePath stringByAppendingPathComponent:cacheKey]];
        if (diskResponse)
        {
            // OPTI: Log the entry last access time for LRU cache eviction algorithm but don't save the dictionary
            //       on disk now in order to save IO and time
            [accesses setObject:[NSDate date] forKey:cacheKey];
            diskCacheInfoDirty = YES;

            // OPTI: Store the response to memory cache for potential future requests
            [super storeCachedResponse:diskResponse forRequest:request];
            return diskResponse;
        }
    }

    return nil;
}

Трассировка стека для каждой утечки NSHTTPURLResponseInternal содержит две ссылки на код SDURLCache.

Первые указывают на линию [accesses setObject:[NSDate date] forKey:cacheKey];.Второе и последнее указывает на следующее:

@implementation NSCachedURLResponse(NSCoder)

- (id)initWithCoder:(NSCoder *)coder
{
    return [self initWithResponse:[coder decodeObjectForKey:@"response"]
                             data:[coder decodeDataObject]
                         userInfo:[coder decodeObjectForKey:@"userInfo"]
                    storagePolicy:[coder decodeIntForKey:@"storagePolicy"]];
}

@end 

Кто-нибудь сталкивался с этой проблемой раньше?Есть мысли по поводу решения?Дайте мне знать, если я должен выложить больше примеров кода.

Cheers.

ОБНОВЛЕНИЕ: Tweet от Оливье Poitrey , автор кода

Я планирую убрать NSURLCache и обработать кеш памяти, это может исправить утечку

1 Ответ

1 голос
/ 20 апреля 2012

Не ответ как таковой, а скорее осознание. NSURLCache на iOS 5.0 и выше теперь кэширует как флэш-память, так и оперативную память по умолчанию. Таким образом, если вы использовали SDURLCache для получения кэширования на диске и нацелены на 5.0 и выше, то нет смысла использовать SDURLCache.

...