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

2019-08-08 01:16发布

我有这样的方法:

- (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会被自动释放,并返回,这时,池排出,使主叫方获得的东西是假的,现在。

我知道我可以显著重新设计的方法,所以我收集了自动释放块以外的所有错误情况,但我想知道是否有在这种情况下,处理错误对象的正确道路。 我不能ALLOC / INIT池块外的推测性NSError,因为域和代码属性是只读(我仍然认为引用将在方法返回时消失)。

如果我改变了方法声明这一点,解决了这个问题:

- (void)processAThing:(id)thing error:(NSError * __strong *)error

但后来我需要在一个非标准的方式调用点大惊小怪左右,这似乎令人震惊,使来电者付出代价,我的内部autoreleasepool。

有什么想法吗? 谢谢。

Answer 1:

我有这个问题我自己。 在这种情况下,我认为你只需要仅仅是之前宣布了新的有力的参考@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;
  }
}

(键入浏览器,而不是由编译器错误校验)

至于你提前返回,我想你将不得不使用一个跳转标签(即使它不漂亮)。



文章来源: What's the right way to set an NSError outparam from inside an autoreleasepool block?