2009-10-29 64 views
7

有许多Cocoa方法需要一个NSError对象作为方法的参数,但如果存在错误,它实际上是一种将错误对象返回给调用方法的方法。这个返回的对象是否保留?也就是说,在调用对象的代码(返回到错误的方法),也有需要是一些代码,如:我是否需要释放一个返回的NSError对象?

NSError *error; 
    [apiCall .... error:&error]; 

    if (error){ 
    [*error release]; 
} 

我还没有看到任何地方这样,如果确实需要发布,这是做到这一点的方式?

回答

7

返回的对象通常是自动发布的。如果您之前在同一个对象上调用copy/alloc/retain,则通常只需拨打auto-/release。你不会提领error在方法调用:

// right 
[error code] 
// wrong 
[*error code] 
+0

我把[*错误代码]的原因是,你也可以指定NSError var为:NSError **错误;这是指向对象的一点。这有效吗? – casademora 2009-10-29 03:28:56

+0

只有当它是“输出参数”或“输出参数”时,才指定'NSError **'作为'error'类型。在这种情况下,您会解除引用,但请注意'* error'将会有'NSError *'类型。您可以使用参数来解决功能只有一个返回值的事实。 Objc-C中的Out参数使用'Type **',因为参数是按值传递的。还要注意的是,如果'error'的类型为'NSError **',你必须用一个指向'NSError *'的指针(这是你在API调用中做的)或者分配一个指针来进行初始化,但有点奇怪。 – outis 2009-10-29 05:01:29

+0

@outis如果它是自动发布的,则不会在调用方法中使用它不正确。因为实际创建NSError *并将其分配给out参数NSError **的方法的作用域已经在方法调用中完成,我们在调用方之后使用它。 – SayeedHussain 2013-08-22 10:12:30

4

您没有为错误分配的内存,所以你不需要将其释放。通常,框架通常会向其创建的任何对象添加autorelease。

6

阅读developer.apple.com上的内存规则 永远不要相信任何重述它们的人,比如“你之前称之为copy/alloc/retain” - 这不是规则,它实际上表示了类似'你通过方法与副本,新的或分配作为名称的一部分'。再次,不要相信我,请阅读developer.apple.com

至于NSError * *,那就错了。该方法接受一个NSError * *作为它的参数,这是一个指向NSError *的指针。其指向NSError *的指针将填充来​​自的某个NSError的地址,该地址为,并且您无权假定位置。

您只能传递指向NSError的指针* - 其他任何错误。

也不应该假定NSError是自动发布的。它可能是单身人士,也可能是任意数量的候补人选。所有你需要知道的是'你没有保留它,你不需要释放它'。

+0

所有权政策(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership。html#// apple_ref/doc/uid/20000043-SW1)是使用copy/alloc/new的方法隐含所有权(并保留显式声明所有权),这决定了谁发送释放消息。 – outis 2009-10-29 05:35:33

+0

第三方不需要遵循此策略,但Apple建议在返回之前自动释放已创建的NSError(http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/CreateCustomizeNSError/CreateCustomizeNSError .html#// apple_ref/doc/uid/TP40001806-CH204-SW5) – outis 2009-10-29 05:36:10

+0

因此“通常自动发布”和“一般规则”。 – outis 2009-10-29 05:37:42

相关问题