2011-07-13 21 views
2

私のiPhoneアプリがクラッシュ私は私のメインのViewControllerでのviewDidLoadにメソッドを追加:iPhoneアプリがクラッシュ - のviewDidLoad

#import "dbQuestionGetterViewController.h" 
#import "dbConnector.h"; 

@implementation dbQuestionGetterViewController 
@synthesize questions; 

-(void)viewDidLoad{ 
    //code to initialise view 
    NSDictionary* arr = [dbConnector getQuestions:2 from:@"http://dev.speechlink.co.uk/David/get_questions.php"]; 
    questions = arr; 
    [arr release]; 
    [super viewDidLoad]; 
} 

私はdbConnectorクラスから静的メソッドを呼び出すんだけど、それもロードする前にクラッシュしました..

dbConnectorでの方法:

//method to 
+(NSDictionary*)getQuestions:(NSInteger)sectionId from: (NSString*) url{ 
    //connect to database given by url 
    //NSError  *error = nil; 
    //NSURLResponse *response = nil; 
    NSMutableString* myRequestString = [[NSMutableString string]initWithFormat:@"section=%@", sectionId]; 
    NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url]]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
    [request setHTTPMethod: @"POST"]; 
    //post section 
    [request setHTTPBody: myRequestData]; 

    //store them in the dictionary 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
    NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSDictionary *questions = [json objectFromJSONString]; 
    [json release]; 

    [request release]; 
    return [questions autorelease]; 
} 

私が間違って何をやっていますか?

+1

私はあなたの他の質問に残した答えからそのコードを得ました。それがあなたを助けたらそれを受け入れてください。私はかなり長い間それを過ごしました。 :/ –

+1

あなたは多くのことを間違ってやっています。あなたのメソッドの先頭に[super viewDidLoad]コールを入れてください。オートレリースされたオブジェクトをメソッドに戻し、別の変数に代入して解放します。 'questions = arr'、' [arr release] 'を実行すると、あなたの質問オブジェクトは現在ゴミと同じメモリ位置を指しています。また、あなたの 'myRequestString'初期化を見て、それを適切に初期化していません。 – Rog

答えて

1

まず第一に、あなたはこのコードで何もしていない:

NSMutableString* myRequestString = [[NSMutableString string]initWithFormat:@"section=%@", sectionId]; 
NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url]]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"]; 
[request setHTTPMethod: @"POST"]; 
//post section 
[request setHTTPBody: myRequestData]; 

は、それを削除します。

次に、questionsは既に自動リリースされています。

NSDictionary *questions = [json objectFromJSONString]; // < autoreleased 

したがって、単にreturn questions;を実行すると効果があります。

これはまた、ではなく、がこの戻り値を解放することを意味します。したがって、これを取り除く:

[arr release]; 
+0

最初の数行は私がデータベースにデータを投稿するために使うものです。プログラムはあなたの変更を加えた後でもクラッシュします... – user559142

+0

私は答えで後で言いましたものを無視しましたか?それがあなたの問題です。 –

+0

私はこれらの変更を加えたが、それでもクラッシュする... – user559142

1

が返すarrオブジェクトを解放しています。このオブジェクトを既にautoreleaseとマークしているので、明示的に解放する必要はありません。 viewDidLoadから次の行を削除し、あなたが設定する必要があります。

また
[arr release]; 

を、あなたのmyRequestStringは疑わしいです。 stringクラスメソッドを呼び出すと、完全に割り当てられ初期化された文字列が返されますが、 -edという文字列の場合は通常initWithFormatが呼び出されます。で、その行を置き換えます

[[NSMutableString alloc]initWithFormat:@"section=%@", sectionId] 

し、右あなたの[request release]後にそれを解放します。

+0

[arr release]を削除しましたが、それでもクラッシュします。 – user559142

+0

スタックトレースを投稿できますか? – highlycaffeinated

+0

私の無知を許しますが、どうすればいいですか:S – user559142

1

静的メソッドから返されるNSDictionaryは、オートリリースされます。しかし、あなたはviewDidLoadメソッドでそれを解放します。

関連する問題