NSCache stürzt ab, wenn das Speicherlimit erreicht ist (nur unter iOS 7)

Wir verwenden NSCache für UIImages in unserer App. Dies funktioniert problemlos unter iOS-Versionen, die kleiner als 7 sind. Wenn eine Speicherwarnung angezeigt wird, gibt NSCache Objekte wie beabsichtigt frei. Unter iOS 7 stürzt unsere App jedoch kurz nach der ersten Speicherwarnung ab. Es sieht also so aus, als würden mit NSCache gespeicherte Objekte niemals freigegeben, aber der Cache wächst, bis die App abstürzt. Die Profilerstellung mit Instrumenten bestätigt diesen Verdacht.

Ist dieses Problem bei jemand anderem aufgetreten und haben Sie eine Problemumgehung gefunden oder haben Sie bereits einen Fehler gefunden?

Es sieht so aus, als hätten diese Jungs das gleiche Problem:http://www.photosmithapp.com/index.php/2013/10/photosmith-3-0-2-photo-caching-and-ios-7/

Ich habe eine kleine Beispiel-App erstellt, um das Problem zu veranschaulichen. Wenn eine Taste gedrückt wird, die Methode-(IBAction)fillCache:(id)sender wird genannt. Von da an ruft ein Timer-(void)addImageToCache:(id)sender alle 100 ms. Bei dieser Methode wird ein UIImage generiert und in den Cache geschrieben.

Auf dem iPad Mini mit iOS 7.0.3 und 512 MB Speicher stürzt es nach ~ 350 Iterationen ab.

Auf dem iPad 2 mit iOS 5 und 512 MB Speicher stürzt es ebenfalls ab, allerdings erst nach mindestens 3000 Iterationen. Instruments zeigt, dass die Anzahl der UIImage-Instanzen mit jeder Speicherwarnung abnimmt. Dies ist unter iOS 7 nicht der Fall.

- (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];

    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage