Google 앱에서 UIImages 용 NSCache를 사용하고 있습니다. 이것은 7보다 작은 iOS 버전에서 정상적으로 작동합니다. 메모리 경고가 발생하면 NSCache는 의도 한대로 객체를 해제합니다. 그러나 iOS 7에서는 첫 번째 메모리 경고 직후에 앱이 다운됩니다. 따라서 NSCache로 저장된 개체는 절대로 출시되지 않지만 캐시가 응용 프로그램이 다운 될 때까지 커지는 것처럼 보입니다. 계측기로 프로파일 링하면 이러한 의심을 확인할 수 있습니다.메모리 제한에 도달하면 NSCache 충돌이 발생합니다 (iOS 7에서만 사용)
다른 사람이이 문제를 겪었습니까? 해결 방법을 찾았거나 이미 버그를 추적 했습니까?
http://www.photosmithapp.com/index.php/2013/10/photosmith-3-0-2-photo-caching-and-ios-7/ 내가 문제를 설명하기 위해 작은 샘플 응용 프로그램을 만들어 :
그것은 그 사람들이 동일한 문제가 있었다 것 같습니다. 버튼을 누르면 -(IBAction)fillCache:(id)sender
메서드가 호출됩니다. 그 이후로 타이머는 100 ms마다 -(void)addImageToCache:(id)sender
을 호출합니다. 이 방법에서는 UIImage가 생성되어 캐시에 기록됩니다.
iOS 7.0.3 및 512MB 메모리가있는 iPad Mini에서는 ~ 350 회 반복 된 후 충돌이 발생합니다.
iOS 5 및 512MB 메모리가 장착 된 iPad 2에서도 특정 시점에서 충돌이 발생하지만 적어도 3000 회 반복해야합니다. 인 스트 루먼트는 메모리 경고가 발생할 때마다 UIImage 인스턴스 수가 감소 함을 보여줍니다. 이는 iOS 7의 경우에는 해당하지 않습니다.
- (IBAction)fillCache:(id)sender
{
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(addImageToCache:) userInfo:nil repeats:YES];
}
- (void)addImageToCache:(id)sender
{
@autoreleasepool {
CGRect rect = CGRectMake(0, 0, 500, 500);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSString *poolKey = [NSString stringWithFormat:@"junk_%d", count++];
[self.cache setObject:image forKey:poolKey];
}
}
을 ... 나는 손으로 조금 무거운 경우 궁금해 , 대신 totalCostLimit 또는 countLimit을 줄일 수 있습니까? –
@GradyPlayer 동의 함. 나는 당신의 아이디어가 마음에 들지만, 당신이 제시 한 한계를 바꾸면 앱을 안정된 상황으로 복구 할 수 있다고 확신 할 수 있을지 확신 할 수 없습니다. 합리적인 한계를 앞당겨 설정하고 메모리 경고가 처음부터 발생하는 것을 막을 수도 있습니다.그러나 그렇게하고 아직도 기억의 경고를 받으면이 무거운 손으로 접근하는 것은 격변 적 실패에 대비하는 보루가 될 수 있습니다. – Rob
당신은 아마 맞을 것입니다. 스핀 2 개가 runloop 중 하나를 통과하는지 모르겠지만 ... 나중에 그 곳에서 다시 만들 수없는 것이 있으면 안됩니다. –