0

执行以下代码段后,我的应用程序崩溃(iOS/iPhone):

    NSHTTPURLResponse *urlResponse = nil;
    NSError *error = [[NSError alloc] init];

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


    if ([urlResponse statusCode] ==500 ) {

        ...

        }
    } else {
        NSLog(@"Response ==> status= %d", [urlResponse statusCode];
    }

    [result release];
    [error release];

在 else 语句处到达的代码,statusCode 为“0”并且代码崩溃,并显示 [CFError release] 已发送到已释放实例的信息。我注释掉了 [error release] 行并且崩溃没有再次发生。但是,我们在这里引入了泄漏。

错误变量出了什么问题?它是从 sendSynchonousRequest 中使用的吗?

解决问题的最佳方法是什么?

4

2 回答 2

2

它没有必要创建错误对象。当您将对象设置为 NSURLConnection 时,它会自动创建自动释放错误对象。这就是你的代码崩溃的原因,因为还有错误释放

尝试这个:

NSHTTPURLResponse *urlResponse = nil;
NSError *error = nil;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


if ([urlResponse statusCode] ==500 ) {

    ...

    }
} else {
    NSLog(@"Response ==> status= %d", [urlResponse statusCode];
}

[result release];
于 2013-06-06T09:09:06.230 回答
1

传递给其他方法的错误对象大多数不会被初始化,如果发生错误,您传递给它的方法将创建错误对象。由于此方法创建了错误对象,因此您不是该对象的所有者,并且您过度释放错误。错误对象被创建为自动释放。

改变 :

NSError *error = [[NSError alloc] init]; 

NSError *error = nil;

并删除

[error release];
于 2013-06-06T09:08:48.560 回答