多个版本消息导致EXC_BAD_ACCESS崩溃

时间:2011-07-06 14:45:03

标签: iphone objective-c crash release nserror

首先,我想首先说我是Objective C和iPhone世界的初学者,到目前为止我非常喜欢它,它非常有趣。

我来自PHP世界,并尝试采用一些非常不同的Objective C概念,例如需要释放自己的对象以避免内存泄漏。

但我遇到一个小问题,当我在函数结束时发布多个变量时,应用程序由于某种原因崩溃并出现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;
    }
}

谢谢:) 晒。

3 个答案:

答案 0 :(得分:3)

你不应该release你不拥有的东西。如果您在其上调用了allocretain,那么您只拥有一些内容。在您的示例中,您应该只发布request

答案 1 :(得分:3)

您必须release自己alloc自己做了什么。在这里,您只分配了request,因此您必须只发布request。所有其他变量都是使用便捷方法创建的,因此它们是自动释放的。

答案 2 :(得分:1)

您只能发布您正在创建的对象。

您的代码中有些对象是自动释放的,而EXC_BAD_ACCESS来自您释放这些对象。

从上面的代码看,您似乎只需要释放“请求”对象。