相关疑难解决方法(0)

使用ARC在块中设置NSError

我希望使用自动引用计数从项目的块中设置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];
    }];
}
Run Code Online (Sandbox Code Playgroud)

这个编译但是给定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];
    }];
}
Run Code Online (Sandbox Code Playgroud)

无法编译时出现以下错误:

将非本地对象的地址传递给__autoreleasing参数以进行回写

谷歌搜索此错误只返回Clang源代码本身的结果.

一个看起来有效但有点难看的解决方案是有一个内部和外部错误指针:

- (BOOL)frobnicateReturningError:(NSError **)error …
Run Code Online (Sandbox Code Playgroud)

objective-c nserror objective-c-blocks automatic-ref-counting

10
推荐指数
1
解决办法
6077
查看次数