NSError *error; vs NSError *error = nil;

5

我开发了一个iOS应用程序,其中包含:

NSError *error; 

替代以下内容:

NSError *error = nil;  

在模拟器和连接的设备上进行调试时,一切正常。然而,当我将其打包并通过TestFlight部署进行测试时,崩溃日志中开始出现“未知信号”错误。为什么会这样呢?
2个回答

6
这是因为您有一个未初始化的指针。只要幸运的话,它就不会崩溃,但使用这样的指针是未定义行为

@daSn0wie 如果不确定,请在声明变量后记录未初始化变量的地址。 NSLog(@“error:%p”,error); - bneely

3
为了澄清dasblinkenlights的回答,这是声明一个变量:
NSError *error; 

...这是声明并赋值变量

NSError *error = nil;  

当你第一次使用它并尝试在没有设置它的情况下访问它时,它指向的值被称为“垃圾”。它是指向某些其他内存堆栈的指针,访问它几乎总会导致应用程序崩溃。因此,最好的做法是像上面那样或稍后将一个值赋给变量。


1
一般情况下,除非方法返回错误状态,否则不应访问NSError变量。如果没有错误,API不能保证错误变量的值。不能仅仅因为将变量设置为nil并通过调用更改了它就依赖于是否出现错误。因此,将其设置为nil既无益也无害。 - zaph
这真的取决于他使用的是哪个API。 - coneybeare
1
从苹果文档中关于 NSError 的描述中可以得知:"通常情况下,方法应该通过返回 NO 或 nil 等方式来表示错误条件,而不是简单地返回一个错误对象。" 依赖返回的错误代码总是安全的,但依赖 NSError 对象可能是安全的也可能不安全,这是一种选择。 - zaph
原帖作者从未指定苹果API。对他的意图进行假设是愚蠢的。 - coneybeare
2
有了ARC,这一切都不重要了。默认情况下,变量在创建时被赋值为nil。 - sudo rm -rf
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接