我从iPhone抓起了崩溃日志:
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
...
...
从我之前的问题Can somebody give me a hand about this stacktrace in iPhone app?开始,我已经更改了我的代码主要围绕UIImage部分。我现在使用[[UIImage alloc] initWithContentsOfFile ...]。不再[UIImage imageNamed:...]等。部分在下面。
//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];
}
我也已将UIImage保留在该属性中。
@property (nonatomic, retain) UIImage* myImage, *myImageFlipped;
内存泄漏也得到了关注。这些变量是以dealloc方法发布的。
我认为我已经成功杀死了这个bug,但似乎我仍然有一个罕见的错误问题。
根据崩溃日志,我的应用程序大喊“performMemoryWarning”。我只是“分配”了13个像素大小为156 x 272的图像。我很困惑。那些图像不应该占用太多内存,超过iPhone的RAM。或者有什么我在俯瞰?请指教。
答案 0 :(得分:0)
为了帮助您解决内存问题和UIImages,您可能需要使用来自文档的UIImage的imageNamed convience方法:
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.
或者,如果在切换到UIImage imageNamed后仍然遇到内存问题,您可能想要this route,因为使用这种方便性方法有一些缺点。
答案 1 :(得分:0)
问题解决了。我忘了在一个地方改变UIImage。现在,所有的UIImages都是真正的“分配”,不再是自动释放。
仅供参考,如果您使用的是[UIImage imageNamed:...],请在iPhone模拟器上使用“模拟内存警告”,以查看当真实设备内存不足时是否存在问题。