gpt4 book ai didi

ios - Objective-C 中的字符串比较与 isEqualToString

转载 作者:行者123 更新时间:2023-11-28 20:48:05 25 4
gpt4 key购买 nike

我有一行代码导致“EXC_BAD_ACCESS”错误。代码行如下(为了方便阅读,格式化为一行,去掉了嵌套代码)。

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

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

最佳答案

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

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

找到那行代码更难,因为回调不是按顺序调用的。

  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" 创建字符串,如果它们具有相同的内容,编译器会将它们映射到他相同的内存,即:

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

都会指向同一个内存空间。

这可能会有所帮助,但我不确定该怎么做?也许您可以发布更多代码,以便我可以在我的设置上运行它。


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

因此,将 sendData 分配给 ivar 后立即调用 autorelease 是个好主意。

...

[sendData autorelease];

...

关于ios - Objective-C 中的字符串比较与 isEqualToString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/756261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com