2009-08-10 7 views
0

Ich griff nach dem Crash-Protokoll aus dem iPhone:Wie sicherzustellen, dass UIImage nie freigegeben wird?

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000c 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x30011940 objc_msgSend + 20 
1 CoreFoundation     0x30235f1e CFRelease + 98 
2 UIKit       0x308f4974 -[UIImage dealloc] + 36 
3 CoreFoundation     0x30236b72 -[NSObject release] + 28 
4 UIKit       0x30a00298 FlushNamedImage + 64 
5 CoreFoundation     0x30250a20 CFDictionaryApplyFunction + 124 
6 UIKit       0x30a0019c _UISharedImageFlushAll + 196 
7 UIKit       0x30a00730 +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] + 8 
8 Foundation      0x3054dc7a _nsnote_callback + 178 
9 CoreFoundation     0x3024ea52 _CFXNotificationPostNotification + 298 
10 Foundation      0x3054b854 -[NSNotificationCenter postNotificationName:object:userInfo:] + 64 
11 Foundation      0x3054dbba -[NSNotificationCenter postNotificationName:object:] + 14 
12 UIKit       0x30a00708 -[UIApplication _performMemoryWarning] + 60 
13 UIKit       0x30a006a0 -[UIApplication _receivedMemoryNotification] + 128 
14 UIKit       0x30a005d0 _memoryStatusChanged + 56 
15 CoreFoundation     0x30217410 __CFNotificationCenterDarwinCallBack + 20 
16 CoreFoundation     0x3020d0aa __CFMachPortPerform + 72 
17 CoreFoundation     0x30254a70 CFRunLoopRunSpecific + 2296 
18 CoreFoundation     0x30254164 CFRunLoopRunInMode + 44 
19 GraphicsServices    0x3204529c GSEventRunModal + 188 
20 UIKit       0x308f0374 -[UIApplication _run] + 552 
21 UIKit       0x308eea8c UIApplicationMain + 960 
... 
... 

Aus meiner vorherigen Frage, Can somebody give me a hand about this stacktrace in iPhone app?, ich habe meine Codes in erster Linie um UIImage Teil geändert. Ich benutze jetzt [[UIImage alloc] initWithContentsOfFile ...]. Nicht mehr [UIImage imageNamed: ...] oder ähnliches. Der Teil ist darunter.

//this is a method of a subclass of UIImageView. 
    - (void) reviewImage: (bool) review{ 
     NSString* st; 
     if (review){ 
     NSString* origin = [NSString stringWithString: [[ReviewCardManager getInstance] getCardImageString:chosenIndex]]; 
     NSString* stt = [origin substringToIndex: [origin length]-4]; 

     st = [[NSString alloc] initWithString: stt]; 

     if (myImageFlipped == nil) 
     myImageFlipped = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:st ofType:@"png"]]; 
     [self setImage:myImageFlipped]; 

     if (notRotated){ 
      self.transform = CGAffineTransformRotate(self.transform, [MyMath radf:rotate]); 
      notRotated = false; 
     } 
    }else{ 
     st = [[NSString alloc] initWithFormat:@"sc%d", chosenNumber]; 

     if (myImage == nil) 
     myImage = [[UIImage alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:st ofType:@"png"]]; 

     [self setImage:myImage]; 

     if (notRotated){ 
      self.transform = CGAffineTransformRotate(self.transform, [MyMath radf:rotate]); 
      notRotated = false; 
     } 

    } 
    [st release]; 
} 

Ich habe auch die UIImage bereits in der Eigenschaft beibehalten.

@property (nonatomic, retain) UIImage* myImage, *myImageFlipped; 

Speicherlecks wurden ebenfalls berücksichtigt. Diese Variablen sind in der Dealloc-Methode freigegeben.

Ich dachte, dass ich den Fehler erfolgreich getötet habe, aber es scheint, dass ich noch ein selten auftretendes Bug Problem habe.

Basierend auf dem Absturzprotokoll schreit meine Anwendung "performMemoryWarning". Ich bin nur "allokieren" -13 .png Bilder mit der Größe 156 x 272. Ich bin verwirrt. Diese Bilder sollten nicht so viel Speicherplatz beanspruchen, dass sie den RAM des iPhones übersteigen. Oder gibt es etwas, das ich übersehe? Bitte beraten.

+0

Ihre Eigenschaft scheint "myImage" genannt zu werden, doch Ihr Setter heißt "setImage:". Kannst du mir bitte erklären, was hier vor sich geht? – hatfinch

+0

Ich untergliedere UIImageView und diese Klasse hat 2 UIImage. Wenn ich das Bild von UIImageView ändern möchte, rufe ich im Grunde setImage auf. – Karl

Antwort

0

Das Problem ist gelöst. Ich habe vergessen, UIImagage an einem Ort zu ändern. Nun, alle UIImagages sind wirklich "alloc", keine Autorelease mehr. Wenn Sie [UIImake imageNamed: ...] verwenden, verwenden Sie "Simulate Memory Warning" auf dem iPhone Simulator, um festzustellen, ob ein Problem damit besteht, wenn das tatsächliche Gerät nicht genügend Arbeitsspeicher zur Verfügung hat.

0

Um Ihnen Speicherprobleme und UIImages zu helfen, könnten Sie die Imagenamed convience Methode der UIImage aus der Dokumentation verwenden möchten:

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

Alternativ könnten Sie this route wenn Sie noch hinwollen laufen in Speicherprobleme nach dem Wechsel zu UIImage imageNamed, weil es einige Nachteile gibt, die convinience-Methode zu verwenden.

+0

Nein, das Poster erwähnte bereits, dass sie * image * von imageNamed * wegbewegt hatten, was ich hätte empfehlen können, um diese Speicherwarnungen zu adressieren, da der Cache von imageNamed nicht mit der Kontrolle des Programmierers verbunden ist. – hatfinch

+0

Ah, ich habe diesen Abschnitt gelesen. In diesem Fall wäre dann ein benutzerdefinierter Cache wie im verknüpften Blog-Post sinnvoller. –

Verwandte Themen