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

cas*_*ora 7 iphone error-handling cocoa memory-management objective-c

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

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

  if (error){
    [*error release];
 }
Run Code Online (Sandbox Code Playgroud)

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

out*_*tis 7

返回的对象通常是自动释放的.一般规则是你只调用auto-/ release如果你之前在同一个对象上调用copy/ alloc/ retain.你不会error在方法调用中取消引用:

// right
[error code]
// wrong
[*error code]
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

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

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