Сбой приложения iPhone - viewDidLoad - PullRequest
2 голосов
/ 14 июля 2011

Сбой моего приложения для 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];
}

что я делаю не так?

Ответы [ 3 ]

1 голос
/ 14 июля 2011

NSDictionary, возвращаемый статическим методом, автоматически высвобождается. Но вы отпускаете его в методе viewDidLoad.

1 голос
/ 14 июля 2011

Прежде всего, вы ничего не делаете с этим кодом:

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];  
1 голос
/ 14 июля 2011

Вы освобождаете объект arr, который возвращает getQuestions. Поскольку вы уже пометили этот объект как autorelease, вам не нужно явно освобождать его самостоятельно. Удалите следующую строку из viewDidLoad, и вы должны быть установлены:

[arr release];

Кроме того, ваш myRequestString является подозрительным. Вы вызываете метод класса string, который возвращает полностью выделенную и инициализированную строку, но затем вы вызываете initWithFormat для него, что обычно для строк, которые вы только что alloc -ed. Замените эту строку на:

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

и затем отпустите его сразу после вашего [request release].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...