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

Ben*_*tto 9 objective-c autorelease ios automatic-ref-counting

我有这样的方法:

- (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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果我将方法声明更改为:它解决了这个问题:

- (void)processAThing:(id)thing error:(NSError * __strong *)error
Run Code Online (Sandbox Code Playgroud)

但后来我需要以非标准的方式在呼叫站点上大惊小怪,这似乎让调用者为我的内部自动释放池付出了代价.

有什么想法吗?谢谢.

Eri*_*ner 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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