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

我有这样的一个方法:

- (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是autoreleased,并且当返回发生时,池被耗尽,所以调用者得到的东西现在是假的。

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

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

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

但是接下来我需要以非标准的方式在呼叫站点大惊小怪,而这让调用者为我的内部autoreleasepool支付代价似乎太过分了。

有什么想法吗? 谢谢。

我自己有这个问题。 在这种情况下,我认为你只需要在@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; } } 

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

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