我希望使用自动引用计数从项目的块中设置一个 NSError 指针。以下是我的代码的简化版本:
- (BOOL)frobnicateReturningError:(NSError **)error
{
NSArray *items = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
__block Frobnicator *blockSelf = self;
[items enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) {
[blockSelf doSomethingWithItem:item error:error];
}];
}
这可以编译,但error
可以通过
doSomethingWithItem
我尝试为要修改的块创建一个本地 NSError 来修改,然后error
在枚举之后使用它来设置原始值(我没有显示):
- (BOOL)frobnicateReturningError:(NSError **)error
{
NSArray *items = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
__block Frobnicator *blockSelf = self;
__block NSError *blockError = nil;
[items enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) {
[blockSelf doSomethingWithItem:item error:&blockError];
}];
}
这无法编译并出现以下错误:
将非本地对象的地址传递给 __autoreleasing 参数以进行回写
谷歌搜索这个错误只会返回 Clang 源代码本身的结果。
一种似乎可行但有点难看的解决方案是拥有一个内部和外部错误指针:
- (BOOL)frobnicateReturningError:(NSError **)error
{
NSArray *items = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];
__block Frobnicator *blockSelf = self;
__block NSError *outerError = nil;
[items enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) {
NSError *innerError = nil;
[blockSelf doSomethingWithItem:item error:&innerError];
outerError = innerError;
}];
}
从块中设置 NSError 的正确方法是什么?