2013-12-09 30 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; 

如果您综合访问者,他们应该为你做保留/发布。

为了回答错误发生的原因,我们需要更多的代码。