2

まず最初に、私は 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;
    }
}

ありがとう:)シャイ。

4

3 に答える 3

3

持っていないreleaseものはいけません。allocあなたが電話した場合、またはそれを所有している場合にのみ、あなたは何かを所有retainしています。あなたの例では、リリースするだけですrequest

于 2011-07-06T14:49:19.137 に答える
1

初期化中のオブジェクトのみを解放できます。

コードには自動解放されるオブジェクトがあり、EXC_BAD_ACCESS はそれらのオブジェクトを解放することから発生します。

上記のコードから、「リクエスト」オブジェクトを解放するだけでよいように見えます。

于 2011-07-06T14:49:34.497 に答える