Я хочу установить указатель 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];
}];
}
Это не скомпилируется со следующей ошибкой:
передаваемый адрес не-local объект в параметре __autoreleasing для обратной записи
Поиск в Google для этой ошибки возвращает результаты только из самого исходного кода 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 изнутри блока?