我是否需要释放返回的NSError对象?

时间:2009-10-29 02:57:45

标签: iphone objective-c cocoa memory-management error-handling

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

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

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

我没有在任何地方看到这个,如果确实需要发布,这是否可以这样做?

3 个答案:

答案 0 :(得分:7)

返回的对象通常是自动释放的。一般规则是,如果您之前在同一对象上调用了auto- / release / copy,则只能调用alloc / retain。并且您不会在方法调用中取消引用error

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

答案 1 :(得分:6)

阅读developer.apple.com上的内存规则 永远不要相信任何重述它们的人,比如'你之前称之为复制/分配/保留' - 这不是规则,实际上说的是“你通过带有copy,new或alloc作为名称一部分的方法收到了对象”。再一次,不要相信我,请阅读developer.apple.com

至于NSError * *,那就错了。 METHOD将NSError * *作为其参数,即指向NSError *的指针。它是NSError *的指针,它将填充来自某处的NSError的地址,你无权假设在哪里。

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

您也不应该假设NSError是自动释放的。它可以是单身,也可以是任意数量的替代品。所有你需要知道的是'你没有保留它,你不需要释放它'。

答案 2 :(得分:4)

您没有为错误分配内存,因此您无需释放它。通常,框架通常会将自动释放添加到它创建的任何对象中。