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

答えて

4

EDIT:自分のものではないNSDataを公開しています。

NSArray *arrayFromData = [string yajl_JSON]; // This doesn't need releasing 
:あなたが必要なのは、このとき

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

あなたが入れている。このため間違いの

[arrayFromData release]; 

あなたは、この行は必要ありません。


0あなたは既に自動解放い:(

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

... 

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

をちょうどFYI要求をリリースしている

これは、不要なコードです:

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

あなたは文字列オブジェクトを作成し、その後されています別のものを得る。あなたが作っている最初のものが漏れます。このコードは、あなたが望むことをします:

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

しかし、それはあなたが報告しているクラッシュではなく、漏れの原因です。

(あなただけではなく、ここで、あなたのコード内の他の場所でこのパターンを持っている。)

+0

これは実際にはエラーではありません。私はそれを削除し、アプリはまだクラッシュします。フォーラムでは、ASIHTTPRequestがサーバーを2回呼び出すエラーを起こす可能性があることを読んだので、リクエストをリリースすれば、その機能を防ぐことができると思った。しかし、リクエストを解放し、それを維持すると、同じエラーで私のアプリケーションがクラッシュします。 – nicholjs

+0

別の原因が考えられますか? – deanWombourne

+0

ハハ - しばらくして、何を探すべきかを学び始めました:)私は約2年間、メモリ管理のバグを作ってきました! – deanWombourne