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