免责声明:我是Xcode/iPhone SDK Noob.
我正在尝试建立与现有服务器的客户端TCP/IP连接.连接后,我希望收到一些有关服务器的数据(版本等).
当我建立连接时,NSStreamEventOpenCompleted
事件将触发,因此我知道已建立连接.接下来NSStreamEventHasBytesAvailable
事件触发,我正在执行以下代码.值71(int)存储在len中,我认为这是正确的.但是,行
[data appendBytes:&buffer length:len];
正在崩溃(我想).没有抛出实际错误但我确实看到 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
即使我已明确添加错误捕获:
case NSStreamEventHasBytesAvailable: { NSMutableData *data=[[NSMutableData alloc] init]; uint8_t *buffer[1024]; unsigned int len=0; len=[(NSInputStream *)stream read:buffer maxLength:1024]; if(len>0){ @try{ [data appendBytes:&buffer length:len]; } @catch(NSException *ex){ NSLog(@"Fail: %@", ex); } [statusLabel setText:[data stringValue]]; //[bytesRead setIntValue:[bytesRead intValue]+len]; }else{ NSLog(@"No Buffer"); } break ; }
Jim Puls.. 10
这是C级的一个问题:你对缓冲区和指针感到困惑.
这段代码:
uint8_t *buffer[1024];
给你一个1024指针的堆栈缓冲区uint8_t
,这几乎肯定不是你想要的.代替:
uint8_t buffer[1024];
稍后,您将堆栈上指针的地址传递给 - [NSMutableData appendBytes:length:],这也不是您想要的:在文档中,传递第一个元素:
[data appendBytes:buffer length:len];
有一个非常全面的编程指南,其中包含您正在尝试执行的完整代码,您可能需要参考它.
至于__TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
内存损坏和错误的指针解除引用不是你可以用Objective-C @try
/ 捕获的东西@catch
; 它的水平要低得多.另一方面,如果打开调试,您仍然可以在调试器中捕获它.
这是C级的一个问题:你对缓冲区和指针感到困惑.
这段代码:
uint8_t *buffer[1024];
给你一个1024指针的堆栈缓冲区uint8_t
,这几乎肯定不是你想要的.代替:
uint8_t buffer[1024];
稍后,您将堆栈上指针的地址传递给 - [NSMutableData appendBytes:length:],这也不是您想要的:在文档中,传递第一个元素:
[data appendBytes:buffer length:len];
有一个非常全面的编程指南,其中包含您正在尝试执行的完整代码,您可能需要参考它.
至于__TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__
内存损坏和错误的指针解除引用不是你可以用Objective-C @try
/ 捕获的东西@catch
; 它的水平要低得多.另一方面,如果打开调试,您仍然可以在调试器中捕获它.
将缓冲区声明为:
uint8_t buffer[1024];
并附加为:
[data appendBytes:buffer length:len];