NSError背后的概念

时间:2011-11-16 14:54:56

标签: objective-c pointers

我在一些地方一直使用NSError,但我并没有真正掌握它背后的概念。特别是为什么它使用这样的双指针:

NSError *err = nil;
NSString *s = nil;
s = [NSString stringWithContentsOfURL:url error:&err];

那么为什么我们不能只将变量err传递给方法,就我所知,该方法以“by-reference”的形式传递。

感谢您的澄清

2 个答案:

答案 0 :(得分:3)

This是关于NSError的最佳描述之一。

实际上你传递的不是一个对象,而是一个指向指针的指针。这样,您可以在将消息发送到nil之前设置NSError,并且只有在发生错误时,NSError才会“突然”保存一个值,以便您可以执行以下操作:

NSError *err = nil;

[SomeClass doSomethingGreatWhichCanFailWithError:&err];

if(err) {
   NSLog("Something failed :-(");
   //TODO: Add better logging!
}

否则,您必须在发送消息之前创建NSError实例,而不是在发生错误时检查属性或其他内容。

答案 1 :(得分:2)

通过引用传递对象需要您分配和初始化NSError对象,然后可以通过被调用的方法对其进行操作以满足需要。这还需要直接在NSError中具有所有功能,或者要求调用者知道并使用NSError的特定子类。

使用此方法,调用者根本不必创建NSError对象。在大多数情况下,不应发生错误,也不会创建无用的错误对象。此外,任何类都可以使用NSError的子类来提供更多信息。如果调用者不关心这个,它会将返回的对象解释为简单的NSError,一切都很好。如果调用者对细节感兴趣,它可以转换为子类并获得更多信息。