将iPhone应用程序从2.2移动到3.0模拟器时的EXC_BAD_ACCESS
-
06-07-2019 - |
题
我有一个我在iPhone SDK 2.2中开发的应用程序,我最近在3.0模拟器中构建并启动了它。基本SDK仍设置为2.2。我认为这可以避免问题。相反,我得到
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3
Crashed Thread: 0
Thread 0 Crashed:
0 libobjc.A.dylib 0x92f4b688 objc_msgSend + 24
1 Foundation 0x305085bd -[NSCFString isEqualToString:] + 61
2 HappyApp 0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64)
崩溃发生在一个非常简单的行上,其中 total
是 UITextField
if (![total.text isEqualToString:@""] ) {
有没有人遇到过这个?我觉得这是一个线程争用问题,或者我的整个应用程序没有正确编译。它适用于2.2.1模拟器。如果事实证明这不是在OS 3.0中测试2.2应用程序的方法,那么除了切换下拉框之外我应该做些什么呢?
更新:Andrew Pouliot说得对,因为这是一个已发布的参考问题。调试器指向一行,所以我得到了错误的提示。罪魁祸首实际上是第一行:
if(!([total.text isEqual:totalTextCache]
&& [divisions.text isEqual:divisionsTextCache])) {
//Loads the data for the table only if the values were actually changed
totalTextCache = total.text; //ditto for divisions
}
这些行是 totalTextCache
的唯一用途,如果 total.text
被更改,它将变为无效。
这从来没有在2.2.1 sim中引起问题,可能是因为旧的 total.text
在更改值时从未被运行时释放。但是这段代码错了。我通过更改它来修复它,以完全按照我认为isEqual正在做的事情:
if(!(total.text==totalTextCache && divisions.text==divisionsTextCache))
因为我实际上并不想复制 NSString
,而只是检查它们是否已经改变(因此引用会改变,这样可行。这个坏代码运行正常2.2.1运行时因为旧引用仍然可以通过 isEqual
检查并比较它的哈希属性。
解决方案
当我安装我的3.0 SDK时,我的2.0工具消失了,所以不确定这是否适用,但我不认为模拟器版本设计为与以后的运行时二进制兼容。
问题很可能在于您的代码。如果是这样,我可以说你有一个内存管理问题,而不是“线程争用”。一切都发生在UIKit的主线程上(不是线程安全的)。
检查您设置总变量的位置;当你点击这个方法时,它可能已经被释放了。确保您的retainCount是明智的。
构建3.0时是否有相同的错误?