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

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

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

有帮助吗?

解决方案

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

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

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

  1. 添加更多断点
  2. 添加更多 NSLog(..)
  3. 考虑捕获异常(参见 在 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];

...

其他提示

这听起来像你试图将消息发送到一个对象,它的内存已经被释放。确保你跟随在内存管理编程指南可可。此修复程序可能会在某个时候加入[sendData retain]它被释放前,而是要理解为什么这样的作品,一定要仔细阅读上述指南。

,以防止将消息发送到一个可用的非对象时崩溃释放后设置你的目的是零。

曼问题是在此行

如果([appVersion isNotEqualTo:CURRENTVERSION])

“isNotEqualTo” 在Mac OS X的10.X或更高但不上iphone OS支持。因此调用这会导致在设备异常。现在我希望你能整点,而不是改变你的比较逻辑,如果([appVersion isEqualToString:CURRENTVERSION]!),我认为这将很好地工作..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top