又一个“消息发送到解除分配的实例”

时间:2013-06-06 09:03:28

标签: iphone ios memory-management

执行以下代码段后,我的应用程序崩溃了(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]发送到解除分配的实例的信息。我评论说了 行[错误发布]和崩溃没有再发生。但是我们在这里引入了泄漏。

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

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

2 个答案:

答案 0 :(得分:2)

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

试试这个:

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];

答案 1 :(得分:1)

传递给另一个方法的错误对象大多数都没有被初始化,传递给它的方法会在错误发生时创建错误对象。由于此方法创建了错误对象,因此您不是该对象的所有者,而是过度释放错误。错误对象创建为autorelease。

更改:

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

NSError *error = nil;

并删除

[error release];