将iPhone应用程序从2.2移动到3.0模拟器时的EXC_错误访问

将iPhone应用程序从2.2移动到3.0模拟器时的EXC_错误访问,iphone,iphone-sdk-3.0,ios-simulator,Iphone,Iphone Sdk 3.0,Ios Simulator,我在iPhoneSDK2.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

我在iPhoneSDK2.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模拟器中工作。如果这不是在OS3.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

检查和比较它的哈希属性。当我安装3.0 SDK时,我的2.0工具消失了,所以不确定这是否适用,但我认为模拟器构建不是必需的GNE与未来的运行时是二进制兼容的

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

检查设置total变量的位置;在使用此方法时,它可能已经被释放。请确保重新计算是合理的


在为3.0构建时,您是否也有相同的错误?

我正在为3.0构建。我没有为2.2.1构建错误。我从未释放TextField,它是一个IBOutlet,是我唯一视图的一部分。另一个字符串是文本。调试程序可能在我的代码中有点偏离,请参阅几次。要恢复2.0工具,请转到项目>编辑项目设置,在常规选项卡中,将所有配置的基本SDK设置为2.x SDK。