2011-01-21 64 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