【发布时间】:2011-06-29 09:37:46
【问题描述】:
我从我的 iPad 应用程序的崩溃报告中获得了这个符号化的堆栈跟踪(摘录):
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread: 0
0 ImageIO 0x34528eb4 _CGImagePluginIdentifyPNG + 0
1 ImageIO 0x34528d90 _CGImageSourceBindToPlugin + 368
2 ImageIO 0x34528bda CGImageSourceGetCount + 26
3 UIKit 0x341b8f66 _UIImageRefAtPath + 366
4 UIKit 0x342650ce -[UIImage initWithContentsOfFile:] + 50
5 UIKit 0x342b0314 +[UIImage imageWithContentsOfFile:] + 28
6 DesignScene 0x00013a2a -[LTImageCache fetchImageforURL:] (LTImageCache.m:37)
…
这里是-[LTImageCache fetchImageforURL:]的内容:
- (UIImage *)fetchImageforURL:(NSString *)theUrl {
NSString *key = theUrl.md5Hash;
return [UIImage imageWithContentsOfFile:[self filenameForKey:key]];
}
还有-[LTImageCache filenameForKey:]的内容:
- (NSString *) filenameForKey:(NSString *) key {
return [_cacheDir stringByAppendingPathComponent:key];
}
_cacheDir ivar 在-init 中创建和保留。那么问题来了,是什么导致了这次崩溃?问题是:
-
-[LTImageCache filenameForKey:]的返回值需要保留(它是自动释放的) - 某处未处理的异常(
+[UIImage imageWithContentsOfFile:]声称如果图像无法识别,则返回nil) - 还有别的……我猜不到
我认为自动发布的值会很好。事实上,这段代码已经运行了好几个月,而且这个方法在一个会话中被调用了 100 次。这是在非常特殊的情况下很少发生的崩溃(应用程序在一夜之间加载,早上解锁 iPad 时崩溃)。
是什么导致了这个崩溃?
【问题讨论】:
标签: objective-c cocoa-touch ios memory stack-trace