2013-12-13 18 views
0

我在使用從遠程服務器接收的數據時遇到了一些問題。這是我參加從我nsinputstream數據:目標C-使用[NSString initwithdata]時混淆EXC_BAD_ACCESS

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例外,他們通常意味着你試圖訪問d無論是不存在還是未分配。 _schools變量顯示1024字節的大小,所以我知道有正確分配的內存。還有什麼我錯過的錯誤嗎?

+0

你爲什麼在某些地方使用'_schools',而在其他地方使用'self.schools'(非常接近下一行)? – nhgrif

+0

如果用'_schools'替換'self.schools',會出現同樣的錯誤? – juniperi

+0

爲什麼你不做'NSString * schoolString = [[NSString alloc] initWithData:[_ server returnData] encoding:NSUTF8StringEncoding];'這是否會產生相同的錯誤? – nhgrif

回答

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]; 

,它應該只是罰款。

+0

是的,我錯過了缺失的'*'。發現裏面有一些片狀的東西,但不知道是什麼。 (這有助於實際上有時注意警告信息。) –

+0

謝謝@CodaFi,這工作完美 – angerboy