Сообщения с несколькими выпусками вызывают сбой EXC_BAD_ACCESS - PullRequest
2 голосов
/ 06 июля 2011

Прежде всего, я хочу начать с того, что я вроде новичок в Objective C и мире iPhone, и мне это очень нравится, это действительно интересно.

Япришедший из мира PHP и пытающийся принять некоторые из самых разных концепций Objective C, таких как необходимость выпускать свои собственные объекты, чтобы избежать утечек памяти.

Но у меня возникает небольшая проблема, когда я выпускаю большечем 1 переменная в конце моей функции, приложение по какой-то причине вылетает с ошибкой EXC_BAD_ACCESS.Я уверен, что это что-то маленькое и глупое, но я вроде не знаю.

Буду признателен за ваше руководство, вот мой код:

+ (id) getJsonFromURL: (NSURL *)url withQueryString: (NSString *)queryString withMethod: (NSString *)HTTPMethod error: (NSError **)outError{
    // Initialize request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    NSData *requestData = [NSData dataWithBytes:[queryString UTF8String] length: [queryString length]];

    // Set request data and method
    [request setHTTPMethod:HTTPMethod];
    [request setHTTPBody:requestData];

    // Perform request
    NSURLResponse *uResp = nil;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&uResp error:nil];

    // Make sure HTTP Request was successful (HTTP Code 200)
    NSInteger httpStatus = [((NSHTTPURLResponse *)uResp) statusCode];
    if(httpStatus != 200){
        NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
        [userInfo setValue:[NSString stringWithFormat:@"The requested URL could not be read (HTTP Code: %d)", httpStatus] forKey: NSLocalizedDescriptionKey];
    }[NSException raise:@"MerchGuru.BadURL" format:@"The URL couldn't be read (HTTP Code: %d)", httpStatus];

    // Decode JSON Output
    NSError *jsonError = nil;
    id respData = [[CJSONDeserializer deserializer] deserialize:returnData error:&jsonError];

    if(jsonError != nil){
        if(outError != nil){
            NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
            [userInfo setValue:@"The JSON Output provided isn't valid JSON!" forKey:NSLocalizedDescriptionKey];

            *outError = [NSError errorWithDomain:@"com.freak4pc.merchguru" code:6001 userInfo: userInfo];

            [userInfo release];
            NSLog(@"%@", [*outError localizedDescription]);
        }

        [respData release];
        [jsonError release];
        [returnData release];
        [uResp release];
        [requestData release];
        [request release];


        return nil;
    }else{
        [respData release];
        [jsonError release];
        [returnData release];
        [uResp release];
        [requestData release];
        [request release];

        return respData;
    }
}

Спасибо :) Shai.

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Вы должны только release, что вы alloc съели сами.Здесь вы только выделили request, поэтому вы должны выпустить только request.Все остальные переменные создаются с помощью вспомогательных методов, поэтому они автоматически высвобождаются.

3 голосов
/ 06 июля 2011

Вы не должны release то, что вам не принадлежит.У вас есть что-то, только если вы позвонили alloc или retain.В вашем примере вы должны выпустить только request

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

Вы можете освобождать только те объекты, которые инициируете.

В вашем коде есть объекты, которые автоматически высвобождаются, и ваша EXC_BAD_ACCESS происходит от того, что вы отпускаете эти объекты.

Из приведенного выше кода похоже, что вам нужно только освободить объект "request".

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