Objective-C中具有isEqualToString的字符串比较

问题描述 投票:0回答:4

我有一行代码会导致“ EXC_BAD_ACCESS”错误。该行代码如下(格式化为一行,并删除了嵌套代码,以便于阅读)。

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

实际错误发生在IF线上。奇怪的是,如果在该行上放置一个断点,则NSString称为sendData(显示为NSCFString,值为“-”,不带引号)。为什么这会导致错误?

ios objective-c nsstring string-comparison
4个回答
2
投票

要解决此问题,您必须在所有回调方法中放置断点。

问题很简单,代码正在尝试访问它找不到的内存。

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

  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中或之后的某个位置,我认为这是回调。尝试在TwoViewAppAppDelegate.m中在第157行附近放置一个断点]


不是添加该行会导致EXC_BAD_ACCESS

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

对于if()语句,您可以看到它越过了if ( ![sendData isEqualToString:@"-"] ){...}

从方法调用返回时发生错误。


好的表格,您认为这可能有所帮助:

如果使用@"My string"创建字符串,则编译器会将它们具有相同的内容(即:]映射到same内存中,即:

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

将全部指向相同的存储空间。

这可能有帮助,但是我不确定如何?也许您可以发布更多代码,以便我可以在我的设置中运行它。


请记住,在iPhone上的事件周期开始时会创建一个自动释放池。

因此,一旦将其分配给ivar,最好在sendData上调用autorelease。

...

[sendData autorelease];

...

1
投票

听起来您正在尝试向已释放内存的对象发送消息。确保您遵循Memory Management Programming Guide for Cocoa中讨论的适当的内存管理技术。解决方法可能是在释放[sendData retain]之前将其添加到某个位置,但是要了解为什么它起作用,您必须阅读上述指南。


0
投票

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


-1
投票

人的问题在这一行中

if([appVersion isNotEqualTo:currentVersion])

在Mac OS X 10.X或更高版本上支持

“ isNotEqualTo”,但在iPhone OS上不支持。因此调用它会在device上导致异常。现在,我希望您能理解所有要点,而不是将比较逻辑更改为if(![appVersion isEqualToString:currentVersion]),我认为它将很好..

© www.soinside.com 2019 - 2024. All rights reserved.