Iphone 写入从NSNetService对象获取的NSOutputStream时应用程序崩溃

Iphone 写入从NSNetService对象获取的NSOutputStream时应用程序崩溃,iphone,Iphone,我正在努力理解和修改WiTap示例iPhone应用程序(工作正常)。在我对代码的修改中,我能够让两个设备相互定位并解析NSNetService对象,然后在其上调用getInputStream:outputStream来创建NSInputStream和NSOutputStream对象 问题是,当我尝试使用NSOutputStream从一个设备向另一个设备发送内容时,发送应用程序立即崩溃,即使接收应用程序成功获取消息并显示UIAlert 以下是我用来发送的代码: NSString *str = [[

我正在努力理解和修改WiTap示例iPhone应用程序(工作正常)。在我对代码的修改中,我能够让两个设备相互定位并解析NSNetService对象,然后在其上调用
getInputStream:outputStream
来创建
NSInputStream
NSOutputStream
对象

问题是,当我尝试使用
NSOutputStream
从一个设备向另一个设备发送内容时,发送应用程序立即崩溃,即使接收应用程序成功获取消息并显示
UIAlert

以下是我用来发送的代码:

NSString *str = [[NSString alloc] initWithString:@"teststring7"];
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[str release];
[outStream write:[data bytes] maxLength:[data length]];
[data release];
我已经尝试过所有可能的组合,包括释放或不释放、保留或不保留这些不同的对象,但似乎没有任何效果——发送应用程序每次都会崩溃

我对原始示例所做的更改之一是将我的应用程序委托的streams属性设置为:

@property (nonatomic, retain) NSInputStream *inStream;
@property (nonatomic, retain) NSOutputStream *outStream;
这可能就是我的应用程序崩溃的原因吗

我尝试将发送代码包装在try/catch块中,但这并不能防止崩溃

更新:这是回溯(很抱歉字体太难看-我想这是每行前面的磅符号):

螺纹4(螺纹13059):

选择$DARWIN_EXTSN()中的0 0x33bb32e4 1 0x357a7426英寸CFSocketManager() 2 0x33c14684英寸线程开始() 3 0x33c06014在螺纹_开始() 螺纹3(螺纹12803):

0 0x33b89e70英寸马赫数msg陷阱() 1 0x33b8c35c(单位:马赫数) 2 0x3576e7ee在\uuuu CFRunLoopServiceMachPort()中 3 0x3576dff6在\uuuu CFRunLoopRun()中 CFRunLoopRunSpecific()中的4 0x3576dd7a CFRunLoopRunInMode()中的5 0x3576dc88 RunWebThread()中的6 0x34177ef0 7 0x33c14684英寸线程开始() 8 0x33c06014在螺纹_开始() 螺纹2(螺纹12291):

kevent()中的0 0x33bbe34c 1 0x33c8c770位于调度管理器调用()中 调度队列调用()中的2 0x33c8c1bc 3 0x33c8c35c在调度工人螺纹2中() 4 0x33c14c40 in_pthread_wqthread() 启动线程()中的5 0x33c0bb6c 螺纹1(螺纹11523):

objc_msgSend()中的0 0x35107420 CFRelease()中的1 0x35750c74 2 0x35750162英寸自动释放池POP() 3 0x3093e664 in-[NSAutoreleasePool release]() 4 0x31969130英寸应用程序句柄() 5 0x336adde0英寸紫色的VentCallback() 6 0x3577be46 inCFRUNLOOP\u正在调用\u OUT\u到\u A\u SOURCE1\u PERFORM\u函数() 7 0x3577be04英寸\uuu CFRunLoopDoSource1() 8 0x3576e0a4 in_uucfrunlooprun() CFRunLoopRunSpecific()中的9 0x3576dd7a CFRunLoopRunInMode()中的10 0x3576dc88 GSEventRunModal()中的11 0x336ace8c 12 0x318f0f94英寸-[UIApplication_run]() UIApplicationMain()中的13 0x318ee4d4
14 0x00002444在/Users/kenadams/Documents/WalkyTalkyX/main.m:14删除
[数据发布]
,您正在将
数据
创建为自动释放的对象,因此不应释放它

从stacktrace看来,问题在于字节数组已经消失了-只要
outStream
正在发送数据,您可能根本不应该释放
数据。当数据被释放时,它的字节数组也将消失


如果没有帮助,请在此处阅读我关于调试此类问题的答案:

没有必要尝试解决此问题。发布坠机报告,特别是它的回溯。@Jeremy:好的。什么是崩溃报告,我如何从我的iPhone中获取它?@Jeremy:我已经同步了iPod和崩溃的iPhone,我的日志应该在
~/Library/logs/CrashReporter/MobileDevice/
中,但我的
CrashReporter
文件夹完全是空的(没有
MobileDevice
文件夹或任何东西)。没关系,我关闭了设备上的日志记录。我将在一秒钟内重新生成并发布。即使没有崩溃报告,您也应该能够通过在调试器下运行应用程序自己生成一个。当应用程序崩溃时,GDB将中断,然后您可以使用
thread apply all backtrace
转储所有线程的回溯,包括崩溃线程。谢谢,您的其他答案也非常有用。删除
[数据发布]
至少有一个不同的效果:发送应用程序不会崩溃,但在我关闭发送应用程序之前,接收应用程序不会接收任何内容。也许我需要刷新流,或者最初使用send立即设置创建流?