有人可以帮我一把关于这个堆栈跟踪在iPhone程序?
-
12-09-2019 - |
题
Program received signal: “EXC_BAD_ACCESS”.
(gdb) bt
#0 0x30011940 in objc_msgSend ()
#1 0x30235f24 in CFRelease ()
#2 0x308f497c in -[UIImage dealloc] ()
#3 0x30236b78 in -[NSObject release] ()
#4 0x30a002a0 in FlushNamedImage ()
#5 0x30250a26 in CFDictionaryApplyFunction ()
#6 0x30a001a4 in _UISharedImageFlushAll ()
#7 0x30a00738 in +[UIImage(UIImageInternal) _flushCacheOnMemoryWarning:] ()
#8 0x3054dc80 in _nsnote_callback ()
#9 0x3024ea58 in _CFXNotificationPostNotification ()
#10 0x3054b85a in -[NSNotificationCenter postNotificationName:object:userInfo:] ()
#11 0x3054dbc0 in -[NSNotificationCenter postNotificationName:object:] ()
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
#13 0x30a006a8 in -[UIApplication _receivedMemoryNotification] ()
#14 0x30a005d8 in _memoryStatusChanged ()
#15 0x30217416 in __CFNotificationCenterDarwinCallBack ()
#16 0x3020d0b0 in __CFMachPortPerform ()
#17 0x30254a76 in CFRunLoopRunSpecific ()
#18 0x3025416a in CFRunLoopRunInMode ()
#19 0x320452a4 in GSEventRunModal ()
#20 0x308f037c in -[UIApplication _run] ()
#21 0x308eea94 in UIApplicationMain ()
#22 0x00002096 in main (argc=1, argv=0x2ffff514)
目前我有一个非常奇怪的错误在我的节目。有时候这种情况发生,有时候,它不。但这里有一个摘要什么:
程序启动时起:
- 保存的数据(只是一个短plist由13个元素)载如果它存在。
- 一个巨大的plist含1014串载入NSMutableDictionary.
- 另一个plist含有78串被载入一个是.
- a.mp4影片的播放。
发生错误部分,其中载ES观点是被拆除和用户是关于查看一串的1014串NSMutableDictionary.
这个错误不会发生在模拟器。它只发生在iPhone上,并有时它运行良好,但有时它粉碎.
然而,在阅读堆栈跟踪我看看CFDictionaryApplyFunction在那里,所以我想这可能是一个可能的原因。这是因为在模拟器上,它读出事情如此之快,整个文字典从plist被装载在一瞬间,而在设备上时,它读出速度较慢?老实说,我不知道究竟如何词典的工作。它不会读通过的所有1014串在一瞬间,或者它使用其他一些线阅读缓慢?请的建议。谢谢你。
解决方案
当你得到一个 EXC_BAD_ACCESS
, 它常常意味着你想要呼叫对象的方法,是不是有可能的,因为它已经释放。
关于下一半的追踪,有一些 存储器的警告 呼叫,例如:
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
这使得它看来,不关你的代码 直接 导致崩溃,而是一个系统的通知时存储器运行低。
近框架#0,这似乎是企图清除缓冲的 UIImage
对象,这似乎是不好的访问。
在此基础上,一个猜测是你们分配一个指向个返回值的一个构造便利;然后对象是个,你可能会觉得这很好因为你不用图像直接,但是存储警告试图访问。例如:
@interface MyClass {
UIImage* myImage;
}
// ...
- (id) init { /* the usual stuff */
myImage = [UIImage imageNamed:@"bob_the.png"];
return self;
}
在这个例子中,甚至如果你有一个保留的位置上 myImage
, 你实际上不保留图像除非你设置的价值通过 self.myImage
.因此,不久之后,这一呼吁,图像被释放,你已经有了一个指向没有男人的土地。
没有看到代码,我已经没有办法知道如果这是什么,实际上是怎么回事,但它是一种类型的错误,那是很容易的。
这些相关问题给予提示类似的崩溃: EXC_BAD_ACCESS
调试 问题1 和 问题2.
最后,如果没有任何帮助,我建议找到一个 最小的再现 你的问题。硬盘的方式来做到这一点是复制你的代码,削减了一半,看看如果错误仍然存在,和重复,直到获得最小的代码你可以找到其再现的错误。它通常很容易调试从有(和更postable作为一个计算器的问题,也是!) 如果你知道的简单的方法,让我知道。
其他提示
你可能需要设置的 NSZombiesEnabled
环境变量。这样你的程序不会崩溃 EXC_BAD_ACCESS
在访问时释放的对象,而是记录翔实的消息。 这篇文章 解释得很好发生什么和如何将它设置在载。不管怎么说,永远不要忘记,禁用这种选择在生产释放,因为否则你的对象将永远不会被释放!