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.
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
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