NSError instellen binnen een blok, met ARC

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?

10
задан Wes 11 September 2011 в 22:47
поделиться