2011-01-21 63 views
0

我在iPhone上使用ASIHTTPRequest来调用服务器,然后发送包含JSON文件的响应。我在基本层面上开展工作,但是当我将它添加到我的项目并打电话给服务器时,我的应用程序开始与bad_access崩溃。iPhone上的ASIHTTPRequest问题(内存?)

我把从viewDidLoad中调用这样:

requestModel = [[RequestModel alloc]init]; 
NSURL *url = [[NSURL URLWithString:@"myURL"]retain]; 
[requestModel eventsRequestFor:@"myUsername" password:@"myPassword" forURL:url]; 

这就要求在名为RequestModel另一个类的函数,我经过,并试图解开返回数组本身(大量的代码):

-(void)eventsRequestFor:(NSString*)username password:(NSString*)password forURL:(NSURL*)forURL { 
//use ASIHTTPRequest to post to sever. Here you authenticate and recieve answer 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:forURL]; 
[request setUsername:username]; 
[request setPassword:password]; 
[request setDelegate:self]; 

[request setDidFailSelector:@selector(uploadFailed:)]; 
[request setDidFinishSelector:@selector(uploadFinished:)]; 
[request startAsynchronous]; 

[request release]; 
NSLog(@"Model called"); 
} 

#pragma mark Model Delegates 
- (void)uploadFinished:(ASIHTTPRequest *)request { 
// Use when fetching text data 

NSLog(@"upload start"); 
NSString *stringFromRequest = [[NSString alloc]init]; 
stringFromRequest = [request responseString]; 

[self buildArrayFromRequest:stringFromRequest]; 

//[stringFromRequest release]; 
} 

- (void)uploadFailed:(ASIHTTPRequest *)request { 
NSString *statusMessage = [request responseStatusMessage]; 
NSLog(@"%@",statusMessage); 
NSError *error = [request error]; 
NSLog(@"%@",error); 

} 

-(void)buildArrayFromRequest:(NSString*)string { 

NSArray *arrayFromData = [[NSArray alloc]init]; 
arrayFromData = [string yajl_JSON]; 
NSLog(@"This is the array from the JSON %@",[arrayFromData objectAtIndex:0]); 
NSMutableArray *events = [[NSMutableArray alloc] init]; 

for(int i= 0; i < [arrayFromData count];i++) 
{ 
    /////code to unpack array 

} 

     ///here i try to populate table with unpacked array 
FirstViewController *firstVC = [[FirstViewController alloc]init]; 
[firstVC createTableWithArray:events]; 

[firstVC release]; 
[arrayFromData release]; 
[events release]; 

} 

关于我要去哪里的任何想法都是错误的?看起来我正在发布一个已经发布的对象,但我找不到它。

+0

你能后的调用堆栈(从调试器)以及好吗? – deanWombourne 2011-01-21 17:56:12

回答

4

编辑:你正在发布的NSData不是你的。

你不需要这行:

你提出:因为这个错误的

[arrayFromData release]; 

NSArray *arrayFromData = [[NSArray alloc]init]; 
arrayFromData = [string yajl_JSON]; 

,当你需要的是这样的:

NSArray *arrayFromData = [string yajl_JSON]; // This doesn't need releasing 

你释放一个已经自动释放的请求:(

// Create an autoreleased request object 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:forURL]; 

... 

[request release]; // fail here - this line is not needed 

仅供参考:

这是不必要的代码:

NSString *stringFromRequest = [[NSString alloc]init]; 
stringFromRequest = [request responseString]; 

你正在一个字符串对象,然后得到一个不同的。你正在做的第一个将被泄露。此代码会做你想要什么:

NSString *stringFromRequest = [request responseString]; // This doesn't need releasing :) 

然而,这是一个漏洞,而不是崩溃要报告的原因。

(你必须在其他地方这种模式在你的代码,而不是在这里。)

+0

这实际上不是错误。我删除了它,应用程序仍然崩溃。在一个论坛上,我读到ASIHTTPRequest可能会造成两次调用服务器的错误,所以我认为如果我发布了请求,那么我会阻止该功能。但是,释放请求并保持它们使我的应用程序崩溃时出现同样的错误。 – nicholjs 2011-01-21 17:09:16