2014-12-04 1 views
3

iOS 8에서만 발생한 문제를 발견했습니다. NSCache을 사용하여 이미지를 저장했습니다. 메모리 경고를받은 후 이미지를 가져 와서 캐시에 다시 저장합니다. 그러나 캐시는 경고 후에 더 이상 내 이미지를 저장할 수 없습니다. objectForKey:을 사용하여 항상 nil을 반환합니다.
여기 내 코드의 일부 :NSCache objectForKey : iOS 8의 메모리 경고 후 항상 nil을 반환합니다.

@interface ViewController() 
{ 
    NSCache *imageCache; 
} 

@implementation ViewController 
- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     imageCache = [[NSCache alloc] init]; 
     [imageCache setTotalCostLimit:1024 * 1024 * 1]; 
    } 
    return self; 
} 
- (void)imageDownloadManager:(ImageDownloadManager *)manager didReceiveImage:(UIImage *)image forObjectID:(NSString *)objecID 
{ 
    NSUInteger cost = [UIImageJPEGRepresentation(image, 0) length]; 
    image = [image smallImageWithCGSize:kImageThumbSize]; 
    [self.imageCache setObject:image forKey:objectID cost:cost]; 
    NSLog("image: %@",[self.imageCache objectForKey:objectID]); //return nil 
} 
@end 

감사합니다 :)

솔루션

당신은 countLimit을 설정해야하고, 값이 0보다 큰 그런 다음 당신은뿐만 아니라 totalCostLimit을 사용할 수 있어야합니다 .

+0

"메모리가 부족하면 그러나, 그것은 자동으로 다른 응용 프로그램에 대한 메모리를 확보하기 위해 요소의 일부를 폐기합니다"... https://developer.apple.com/library/ios/documentation 여기에서 /Performance/Conceptual/ManagingMemory/Articles/CachingandPurgeableMemory.html – TonyMkenu

+0

예! 메모리 경고 이후 초기화 될 수 있으며 저장/검색 할 수 있어야합니다. 그것은 경고 후'setObject :'를 다시 사용할 수없는 것으로 보이고,'imageCache'가 nil이 아니라고 확신합니다. – yuhua

답변

1

나는 (iOS 8.1에서만) 동일한 문제를 겪었으며 totalCostLimit 대신 countLimit을 할당하여 작동 시켰습니다.

// getter 
- (NSCache *)cache 
{ 
    if (!_cache) { 
     _cache = [[NSCache alloc] init]; 
     _cache.countLimit = aLimit; 
    } 
    return _cache; 
} 
+0

그것은 작동합니다! 'totalCostLimit'도 괜찮습니다. – yuhua

관련 문제