2011-07-13 136 views
2

我的iPhone應用程序崩潰時,我加入到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

您正在發佈getQuestions返回的arr對象。由於您已將此對象標記爲autorelease,因此您無需自行明確釋放它。從viewDidLoad刪除以下行,你應該設置:

[arr release]; 

此外,您myRequestString的嫌疑。你正在調用string類的方法,它返回一個完全分配和初始化的字符串,但你打電話initWithFormat,這通常是你只是alloc -ed的字符串。將該行替換爲:

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

然後在您的[request release]之後立即釋放它。

+0

我已刪除[arr發佈],它仍然崩潰。 – user559142

+0

您可以發佈堆棧跟蹤嗎? – highlycaffeinated

+0

原諒我的無知,但我該怎麼做:S – user559142

1

從靜態方法返回的NSDictionary是autoreleased。但是你在viewDidLoad方法中釋放它。