iPhone SDK - NSStreamEventHasBytesAvailable / appendBytes:崩溃

时间:2009-04-10 16:49:02

标签: 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 ;
    }

3 个答案:

答案 0 :(得分:10)

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

此代码:

uint8_t *buffer[1024];

给你一个1024个指向uint8_t的指针的堆栈缓冲区,这几乎肯定不是你想要的。代替:

uint8_t buffer[1024];

稍后,您将堆栈上指针的地址传递给 - [NSMutableData appendBytes:length:],这也不是您想要的:在the documentation中,传递第一个元素:< / p>

[data appendBytes:buffer length:len];

有一个very thorough programming guide包含您正在尝试执行的操作的完整代码,您可能需要参考它。

至于__TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__,内存损坏和错误的指针解除引用不是你可以用Objective-C @try / @catch捕获的;它的水平要低得多。另一方面,如果打开调试,你仍然可以在调试器中捕获它。

答案 1 :(得分:7)

将您的缓冲区声明为:

uint8_t buffer[1024];

并将其追加为:

[data appendBytes:buffer length:len];

答案 2 :(得分:2)

为了完整性read:maxLength:返回NSInteger,如果出现错误则为负数。将它分配给unsigned int会丢弃这个并导致崩溃。