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
을 사용할 수 있어야합니다 .
"메모리가 부족하면 그러나, 그것은 자동으로 다른 응용 프로그램에 대한 메모리를 확보하기 위해 요소의 일부를 폐기합니다"... https://developer.apple.com/library/ios/documentation 여기에서 /Performance/Conceptual/ManagingMemory/Articles/CachingandPurgeableMemory.html – TonyMkenu
예! 메모리 경고 이후 초기화 될 수 있으며 저장/검색 할 수 있어야합니다. 그것은 경고 후'setObject :'를 다시 사용할 수없는 것으로 보이고,'imageCache'가 nil이 아니라고 확신합니다. – yuhua