¿Cuándo debería usar __bridge vs. CFBridgingRelease / CFBridgingRetain?

Tengo este código que utiliza "__bridge" para emitir las identificaciones de colors:

CGColorRef tabColor = (5 == 5 ? [UIColor blueColor].CGColor : [UIColor greenColor].CGColor); CGColorRef startColor = [UIColor whiteColor].CGColor; CGColorRef endColor = tabColor; NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil]; CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations); 

pero lo haría:

  NSArray *colors = [NSArray arrayWithObjects:(id)CFBridgingRelease(startColor), (id)CFBridgingRelease(endColor), nil]; CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)CFBridgingRetain(colors), locations); 

¿Será una mejor solución?

    No "posee" los objects de Core Core startColor , endColor porque no fueron devueltos por una function que tiene "Crear" o "Copiar" en su nombre (compare "Crear regla" en la "Guía de progtwigción de administración de memory para Core Fundación ". Y como no posee los objects, no debe" transferir la propiedad "a ARC con CFBridgingRelease() .

     [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil]; 

    es correcto. Y

     CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations); 

    También es correcto porque

     CGGradientCreateWithColors(colorSpace, (CFArrayRef)CFBridgingRetain(colors), locations); 

    pasaría una matriz (+1) retenida a CGGradientCreateWithColors() . Esto sería una pérdida de memory porque esa function no libera el argumento de colors .

    Con NSURL es el mismo problema

     NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; AudioServicesCreateSystemSoundID(CFBridgingRetain(soundURL), &soundEffect);