从autoreleasepool块中设置NSError outparam的正确方法是什么?

时间:2013-01-23 21:44:01

标签: ios objective-c automatic-ref-counting autorelease

我有这样的方法:

- (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error
{
    @autoreleasepool {

          // Start processing.

          // Find some partway through error..
          if (error) {
              *error = [NSError errorWithDomain...];
              return NO;
          }

          // More processing.
    }
}

这已经崩溃并崩溃,因为NSError是自动释放的,当返回发生时,池被耗尽,所以调用者得到的东西现在是虚假的。

我知道我可以重新设计方法,所以我收集了autorelease块之外的所有错误情况,但是我想知道在这种情况下是否有正确的方法来处理错误对象。我无法在池块之外分配/初始化推测性NSError,因为域和代码属性是只读的(我仍然认为当方法返回时引用会消失)。

如果我将方法声明更改为:

,它就解决了这个问题
- (void)processAThing:(id)thing error:(NSError * __strong *)error

但后来我需要以非标准的方式在呼叫网站上大惊小怪,这似乎让查看者为我的内部autoreleasepool付出代价。

有什么想法?感谢。

1 个答案:

答案 0 :(得分:8)

我自己有这个问题。在这种情况下,我认为您只需要在@autoreleasepool之前声明一个新的强引用,并在该临时引用的@autoreleasepool块之后设置方法参数。

- (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error {
  __strong NSError *errOut = nil;
  @autoreleasepool {
    // do your stuff and set errOut instead of error
  }
  if (error) {
    *error = errOut;
  }
}

(在浏览器中键入,而不是由编译器检查错误)

至于你的过早回归,我猜你必须使用跳跃标签(即使它不漂亮)。