【问题标题】:Do I need to release a returned NSError object?我需要释放返回的 NSError 对象吗?
【发布时间】:2010-12-11 02:43:45
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我放 [*error code] 的原因是您还可以将 NSError var 指定为: NSError **error;这是一个点到一个点的对象。这有效吗?
    • 只有当 NSError ** 是“输出参数”或“输出参数”时,才将其指定为 error 的类型。在这种情况下,您将取消引用,但请注意 *error 的类型为 NSError *。您使用 out 参数来解决函数只有一个返回值这一事实。 Objc-C 中的输出参数使用Type **,因为参数是按值传递的。另请注意,如果error 具有NSError ** 类型,则您必须使用指向NSError * 的指针对其进行初始化(这是您在API 调用中所做的)或分配一个指针,这会发生但是是有点奇怪。
    • @outis 如果它是自动释放的,那么在调用者方法中使用它是不正确的。因为实际创建 NSError * 并将其分配给 out 参数 NSError ** 的方法的范围已经完成了方法调用,我们在调用者中使用它。
    • @paranoidcoder:不,因为 1)您描述的场景与 casademora 不同,后者在调用者中创建 NSError,并在被调用者中使用它,以及 2)动态分配 NSError ,所以它不是automatic variable(只有局部变量是自动的)并且在方法退出时不会被释放。自动释放的对象在其自动释放池耗尽时被回收。这些天来,这一点有点没有实际意义,因为您可能应该使用 ARC(除非您想支持旧平台)。
    【解决方案2】:

    你没有为错误分配内存,所以你不需要释放它。作为一项规则,框架通常会将自动释放添加到它创建的任何对象中。

    【讨论】:

      【解决方案3】:

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

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

      你只能传递一个指向 NSError * 的指针——其他的都是错误的。

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

      【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多