执行以下代码段后,我的应用程序崩溃了(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使用的吗?
解决问题的最佳方法是什么?
答案 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];