我在一些地方一直使用NSError
,但我并没有真正掌握它背后的概念。特别是为什么它使用这样的双指针:
NSError *err = nil;
NSString *s = nil;
s = [NSString stringWithContentsOfURL:url error:&err];
那么为什么我们不能只将变量err
传递给方法,就我所知,该方法以“by-reference”的形式传递。
感谢您的澄清
答案 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,一切都很好。如果调用者对细节感兴趣,它可以转换为子类并获得更多信息。