目标C-使用[NSString initwithdata]时混淆EXC_BAD_ACCESS

时间:2013-12-13 00:45:37

标签: objective-c nsdata exc-bad-access

我在使用从远程服务器收到的数据时遇到了一些麻烦。这就是我从nsinputstream获取数据的方式:

 case NSStreamEventHasBytesAvailable:
    {
        if(!_data)
        {
            _data = [NSMutableData data];
        }

        uint8_t buffer = malloc(1024);
        NSInteger *len = [inputStream read:buffer maxLength:1024];
        if(len)
        {
            _data = [[NSData alloc]initWithBytesNoCopy:buffer length:1024];
            [self closeThread];
        }
        shouldClose = YES;

        break;
    }

在同一个类中,我有这个函数来返回数据,以便在不同的类中使用它:

 -(NSData *)returnData {
      return self.data;
  }

在我想要使用数据的视图控制器中,我有这段代码来检索要使用的数据:

 _schools = [_server returnData];
 NSString *schoolString = [[NSString alloc] initWithData:self.schools encoding:NSUTF8StringEncoding];//exc_bad_access

根据我对EXC_BAD_ACCESS异常的理解,它们通常意味着您正在尝试访问不存在或未分配的数据。 _schools变量显示1024字节的大小,所以我知道有正确的内存分配。我错过了其他的错误吗?

1 个答案:

答案 0 :(得分:1)

您似乎混淆了这两行的变量类型:

uint8_t buffer = malloc(1024);
NSInteger *len = [inputStream read:buffer maxLength:1024];

在当前形式中,您将malloc'吃掉1024字节的内存,并尝试将指针存储到uint8_t中的所有内存(CLANG会正确地向您尖叫),因此截断指针并不提供缓冲区,而是为流尝试读入的单个无符号8位字节。此外,-[NSInputStream read:maxLength:]不返回NSInteger *,只返回普通NSInteger,因此您需要做的就是交换两个变量上的指针:

uint8_t *buffer = malloc(1024);
NSInteger len = [inputStream read:buffer maxLength:1024];

它应该可以正常工作。