2012-04-09 9 views
1

Ich habe einen ViewController mit 16 Tasten. Jede Schaltfläche lädt ein Popover, das 50 Frames beim Verschieben anzeigt.Rahmen mit 50 png in iPhone

Was ist die beste Form, es zu tun?

Ich weiß, dass imageWithName schlecht ist, weil es alle Bilder im Cache zu laden, und aus diesem Grund im tut es mit:

myAnimatedView.animationImages=[NSArray arrayWithObjects: 
           [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0000",nombrePieza]ofType:@"png"]], 
           [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0001",nombrePieza]ofType:@"png"]], 
           [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0002",nombrePieza]ofType:@"png"]], 
    ... 
    ... 
    ...       [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@0050",nombrePieza]ofType:@"png"]],nil]; 

Aber wenn ich etwa 10-mal die popover mit differents Rahmen laden, habe ich eine Speicherverlust nur auf meinem Gerät, aber nicht im Simulator.

Aus diesem Grunde möchte ich wissen, welche die beste Form, es zu tun ist?

mit einem Video? oder mit CAAnimation?

Danke für Hilfe.

Antwort

0

Sie besser einen Timer in diesem Fall zu benutzen, nicht Gedächtnisprobleme

... 
page = 1; 
imageAnim = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; 
[[self view] addSubview:imageAnim]; 
tim = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(avv) userInfo:nil repeats:YES]; 
... 

- (void)avv { 
    UIImage *img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"SplashAnimation %03d", page] ofType:@"png"]]; 
    [imageAnim setContentMode:UIViewContentModeScaleToFill]; 
    [imageAnim setImage:img]; 
    page++; 
    if(page > maxNumberFrame) { 
     [tim invalidate]; 
    } 
} 

Dies ist ein Beispiel zu haben, Ideen

0

imageNamed bekommen kein Leck an sich verursachen (obwohl einige frühere Diskussionen vorschlagen es könnte Bugs in pre iOS 4 gehabt haben).

jedoch imageNamed Ihre Bilder zwischenspeichern, so dass Sie sie nicht für jede Instanz geladen werden, wenn das Bild, das Sie zeigen. In Ihrem Fall, wenn Sie die Animation 10 Mal laden, werden Sie sehen, dass jedes Bild nur einmal geladen wird. Ihre aktuelle Lösung erzwingt, dass Ihre Bilder jedes Mal geladen werden.

Am wichtigsten, die imageNamed Methode wird transparent behandeln die Retina-Version der Bilder, die Sie sonst manuell tun müssten.

Aus der Dokumentation:

Diese Methode sucht in dem Systemcaches für ein Bildobjekt mit dem angegebenen Namen und kehrt das Objekt, wenn es vorhanden ist. Wenn sich ein übereinstimmendes Bildobjekt nicht bereits im Cache befindet, lädt diese Methode die Bilddaten aus der angegebenen Datei, speichert sie zwischen und gibt das resultierende Objekt zurück.

+0

Vielen Dank für Ihre Antwort Freund. Ich lade nicht die gleichen 50 Bilder ... Jeder Knopf hat 50 differents Bilder, und mein Leck tut, wenn ich 10mal mit differents Bildern lade ... Irgendeine Lösung? –