Ik wil een NSError-pointer instellen vanuit een blok in een project met automatische referentietelling. Wat volgt is een vereenvoudigde versie van mijn code:
- (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];
}];
}
Deze compileert maar gegeven fout
kan worden gewijzigd door
doSomethingWithItem
Ik heb geprobeerd een lokale NSError te maken voor het blok om
wijzigen, die vervolgens zou worden gebruikt om de oorspronkelijke -fout
daarna in te stellen
de opsomming (die ik niet heb getoond):
- (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];
}];
}
Compileren mislukt met de volgende fout:
geeft adres van niet-lokaal object door aan __autoreleasing parameter voor terugschrijven
Googlen voor deze fout levert alleen resultaten op van de Clang-broncode zelf.
Een oplossing die lijkt te werken, maar een beetje lelijk is, is om een interne en externe foutaanwijzer te hebben:
- (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;
}];
}
Wat is de juiste manier om een NSError in te stellen vanuit een blok?