将iPhone应用程序从2.2移动到3.0模拟器时的EXC_错误访问
我在iPhoneSDK2.2中开发了一个应用程序,最近我在3.0模拟器中构建并发布了它。基本SDK仍然设置为2.2。我想这样可以避免问题。相反,我得到了将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
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。