iPhone SDK - 字符串比较

问题描述:

我有一行代码导致“EXC_BAD_ACCESS”错误。代码行如下(格式化为一行,为便于阅读,删除了嵌套代码)。iPhone SDK - 字符串比较

if (![sendData isEqualToString:@"-"]){ ... } 

实际的错误发生在IF线上。奇怪的是,如果我在该行上放置了一个断点,则NSString调用sendData(显示为NSCFString,值为“ - ”,不带引号)。为什么会造成错误?请指教。

+0

我意识到当我声明属性sendData在我的appDelegate头文件,我没有使用'保留' - 但我改变了这一点,但仍然收到错误。奇怪的是,我正在使用其他属性,就像这个一样,这是唯一一个产生错误的方法。 – Dutchie432 2009-04-16 14:51:44

为了解决这个问题,你必须在所有的回调方法中加入断点。

问题很简单,代码试图访问它无法找到的内存。

查找该代码行比较困难,因为回调没有按顺序调用。

  1. 添加多个破发点
  2. 添加更多的NSLog(..)
  3. 考虑捕获异常(见throwing an exception in objective-c/cocoa

输出格式控制台:

Attaching to program: `/Users/rjstelling/Library/Application Support/iPhone Simulator/User/Applications/C04A40BB-1D98-402E-BBEF-37E6FB860089/TwoViewApp.app/TwoViewApp', process 24032. 
Re-enabling shared library breakpoint 1 
2009-04-16 16:16:45.830 TwoViewApp[24032:20b] stream event 1 
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] on input stream 
2009-04-16 16:16:45.831 TwoViewApp[24032:20b] stream event 1 
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream 
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] stream event 4 
2009-04-16 16:16:45.832 TwoViewApp[24032:20b] on output stream 
2009-04-16 16:16:45.833 TwoViewApp[24032:20b] stream has space open 
(gdb) continue 
2009-04-16 16:17:06.405 TwoViewApp[24032:20b] We made it - ok! 
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] stream event 2 
2009-04-16 16:17:06.406 TwoViewApp[24032:20b] on input stream 
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] Processing: +OK CONN PinkNotes® Plus Master v5.00.26 Beta (v4 compatible) 
:tPNPStr 
2009-04-16 16:17:06.407 TwoViewApp[24032:20b] SendData= USER (null):tPNPStr 
Current language: auto; currently objective-c 
Program received signal: “EXC_BAD_ACCESS”. 
(gdb) 

问题发生在某处或中在ProcessData之后,我认为这是一个回调。尝试,把一个破发点周围线157 TwoViewAppAppDelegate.m


如果添加这并不是说行就是造成EXC_BAD_ACCESS

else 
{ 
    NSLog(@"We made it - ok!"); 
} 

的if()语句,你可以看到它通过if (![sendData isEqualToString:@"-"]){...}

从方法调用返回时发生错误。您的意见


好形式,这可能帮助:

,如果您使用@"My string"编译器,如果他们有相同的内容,也就是将这些映射到他相同存储器串:

NSString *var1 = @"string1"; 
NSString *anotherstring = @"string1"; 
NSString *morestringivars = @"string1"; 

都会指向相同的内存空间。

这可能有帮助,但我不知道如何?也许你可以发布更多的代码,所以我可以在我的设置上运行它。


记住一个自动发布池是在iPhone上的事件循环开始时创建的。

因此,只要您将它分配给伊娃,在sendData上调用autorelease是一个好主意。

... 

[sendData autorelease]; 

... 

听起来好像你正试图发送一条消息给一个内存已被释放的对象。确保您遵循Memory Management Programming Guide for Cocoa中讨论的正确内存管理技术。解决方案可能是在它被释放之前添加一个[sendData retain],但要理解它的工作原理,您必须阅读上述指南。

+0

林不知道为什么会这样。 sendData是AppDelegate的一个属性,并没有被解除分配(我)。另外,如果对象被释放,我仍然可以在调试器中看到它的值吗? – Dutchie432 2009-04-16 14:09:54

+0

您是否在sendData中获取或创建数据?如果是这样,你可能需要保留。 – rjstelling 2009-04-16 14:15:50

将发布后的对象设置为零,以防止向非可用对象发送消息时发生崩溃。

曼问题是在这条线

如果([appVersion isNotEqualTo:CURRENTVERSION])

“isNotEqualTo” 在MAC支持OS X 10.X或更高但不能在iphone OS。因此调用此设备会导致异常。现在我希望你得到的全部点,而不是改变你的比较逻辑,如果(![appVersion isEqualToString:currentVersion]),我认为它会工作正常..