9

我有这样的方法:

- (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

但是随后我需要以一种非标准的方式在调用站点上大惊小怪,这让调用者为我的内部自动释放池付出代价似乎是令人震惊的。

有什么想法吗?谢谢。

4

1 回答 1

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;
  }
}

(在浏览器中输入,编译器未检查错误)

至于您的过早返回,我想您将不得不使用跳转标签(即使它不漂亮)。

于 2013-01-23T21:50:27.237 回答