要解决这个问题,您必须在所有回调方法中设置断点。
问题很简单,代码试图访问它找不到的内存。
找到那行代码比较困难,因为回调不是按顺序调用的。
- 添加更多断点
- 添加更多 NSLog(..)
- 考虑捕获异常(请参阅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 后立即在 sendData 上调用 autorelease。
...
[sendData autorelease];
...