【发布时间】:2013-01-07 12:54:10
【问题描述】:
我有这样的方法:
- (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
但是我需要以一种非标准的方式在调用站点上大惊小怪,这似乎让调用者为我的内部自动释放池付出代价。
有什么想法吗?谢谢。
【问题讨论】:
-
将签名更改为
(NSError * __strong *)error实际上对我来说似乎是一个合理的选择。
标签: ios objective-c automatic-ref-counting autorelease