我有一个我在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时是否有相同的错误?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top