我有这样的方法:
- (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付出代价。
有什么想法?感谢。
答案 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;
}
}
(在浏览器中键入,而不是由编译器检查错误)
至于你的过早回归,我猜你必须使用跳跃标签(即使它不漂亮)。