0

好吧,我有一个在 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)

崩溃发生在一条非常简单的线路上totalUITextField

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))

因为我实际上并不想复制NSStrings,而只是检查它们是否已更改(因此引用会更改,这是可行的。错误的代码在 2.2.1 运行时运行良好,因为旧的引用仍然可以它的哈希属性由 . 检查和比较isEqual

4

1 回答 1

1

当我安装我的 3.0 SDK 时,我的 2.0 工具消失了,所以不确定这是否适用,但我不认为模拟器构建旨在与未来的运行时兼容。

尽管问题可能出在您的代码中。如果是这样,我可以说你有内存管理问题而不是“线程争用”。一切都发生在 UIKit 的主线程上(不是线程安全的)。

检查您设置总变量的位置;当您使用此方法时,它可能已经发布。确保您的 retainCount 是合理的。

为 3.0 构建时是否有同样的错误?

于 2009-06-19T08:36:21.570 回答