2013-12-09 61 views
-1

我正在開發一個IOS應用程序。 didReceiveResponse中的setLength方法崩潰。你覺得是什麼原因呢。我應該做什麼預防。NSData setLength EXC_BAD_ACCESS

enter image description here

- (void) callService:(NSString*)urlString 
{ 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL urlString]]; 

    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setHTTPBody:[urlString dataUsingEncoding:NSUTF8StringEncoding]]; 

    theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

    if(theConnection) { 
     self.webData = [[NSMutableData data] retain]; 
    } 
    else { 
     NSLog(@"connection is NULL"); 
    } 

} 

#pragma mark Web service 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [self.webData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [self.webData appendData:data]; 
} 
+0

檢查您的控制檯...您正在獲取'connection is NULL'打印 –

+0

異常消息指出setLenght:在*數組*上調用。在didReceiveResponse中設置斷點並檢查self.webData對象。 –

+0

您是否嘗試使用「啓用殭屍」來運行您的應用程序以查找可能的內存管理問題? –

回答

0

通常情況下,在NSData用途崩潰實際上提前釋放的問題。使用[NS(Mutable)Data data]初始化的NSData是一個可自動刪除的對象,即使您對其調用了retain

爲確保在調用didReceiveResponse之前不會釋放此對象,請使用[[NSMutableData alloc] init]對其進行初始化。應該這樣做

+1

這是不正確的。保留對象增加了引用計數,所以即使當前自動釋放池結束時也不會被刪除。 –

+1

由於這種情況一直在上升,所以我覺得有必要備份Martin:這個答案很混亂(「autoreleasable」不是一件事情),並給出了無意義的建議('[[[NSMutableData alloc] init]'與[[NSMutableData data]保留]''從所有權的角度來看] –

-1

試試這個,可以幫助你:

這可能是崩潰由於NULL響應數據,以便檢查響應數據,併爲未來的目的以下條件:

而且綜合你的NSData:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    if(responseData != NULL) 
    { 
     [responseData setLength:0]; 
    } 
} 
+1

'[responseData setLength:0];'如果responseData爲零,則*不會*崩潰。 –

0

它看起來像你的內存管理錯誤。

在這種情況下,它可能是一個過度發售NSMutableData。適當的管理這個對象應該由屬性webData完成。您沒有發佈聲明,但它應該是沿着這條線:

@property (retain) NSMutableData *webData; 

如果您綜合訪問者,他們應該爲你做保留/發佈。

爲了回答錯誤發生的原因,我們需要更多的代碼。