2

首先我想说我是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;
    }
}

谢谢 :) 谢。

4

3 回答 3

3

你不应该release拥有你不拥有的东西。只有当你打电话alloc或打电话时,你才拥有某样东西retain。在您的示例中,您应该只发布request

于 2011-07-06T14:49:19.137 回答
3

你必须只吃releasealloc自己吃的东西。在这里,你只分配了request,所以你只需要释放request。所有其他变量都是使用便捷方法创建的,因此它们是自动释放的。

于 2011-07-06T14:49:59.817 回答
1

您只能释放您正在初始化的对象。

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

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

于 2011-07-06T14:49:34.497 回答