好吧,我有一个在 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
s,而只是检查它们是否已更改(因此引用会更改,这是可行的。错误的代码在 2.2.1 运行时运行良好,因为旧的引用仍然可以它的哈希属性由 . 检查和比较isEqual
。