我在使用从远程服务器收到的数据时遇到了一些麻烦。这就是我从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字节的大小,所以我知道有正确的内存分配。我错过了其他的错误吗?
答案 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];
它应该可以正常工作。