iPhone SDK - NSStreamEventHasBytesAvailable/appendBytes : crashing

标签 iphone cocoa-touch xcode

免责声明:我是 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 ;
    }

最佳答案

这是 C 级别的问题:您对缓冲区和指针感到困惑。

这段代码:

uint8_t *buffer[1024];

为您提供了一个包含 1024 个指向 uint8_t 的指针的堆栈缓冲区,这几乎肯定不是您想要的。相反:

uint8_t buffer[1024];

稍后,您将堆栈上指针的地址传递给 -[NSMutableDataappendBytes:length:],这又不是您想要的:如 the documentation 所示,传递第一个元素:

[data appendBytes:buffer length:len];

有一个very thorough programming guide包含您想要执行的操作的完整代码,您可能需要引用它。

至于 __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__,内存损坏和错误的指针取消引用不是 Objective-C @try/@catch 所能捕获的>;这是低得多的水平。另一方面,如果您打开调试,您仍然可以在调试器中捕获此内容。

关于iPhone SDK - NSStreamEventHasBytesAvailable/appendBytes : crashing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/738213/

相关文章:

iphone - 为什么我的页脚和容器 div 在 iPhone Safari 中未对齐?

iphone - 如何知道 iOS 设备何时插入?

iphone - NSStream,获取读取的字节百分比

iphone - 调整 UIView 的大小

swift - 转换为 Swift 4 后,Xcode 项目不断崩溃, "Class implemented in both..."

ios - 如何获取录音针的坐标以计算用户位置和针之间的距离

iphone - 通过 API 检索 AppStore 图表?

objective-c - 显示背景图像、图像和标题的 UIButton

ios - 不同的苹果证书

ios - 如何创建带删除线文本的 UILabel?