17

Ho questo codice che utilizza "__bridge" per lanciare gli ID dei colori:quando dovresti usare __bridge vs. CFBridgingRelease/CFBridgingRetain?

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); 

ma sarebbe:

NSArray *colors = [NSArray arrayWithObjects:(id)CFBridgingRelease(startColor), (id)CFBridgingRelease(endColor), nil]; 

    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)CFBridgingRetain(colors), locations); 

essere una soluzione migliore?

risposta

22

Non "proprio" oggetti nucleo fondante startColor, endColor perché erano non restituito da una funzione che ha "Crea" o "Copy" nel suo nome (cfr "The Create Rule" nella "Guida alla gestione della memoria per programmazione nucleo della Fondazione". E perché non si possiede gli oggetti, non si deve 'trasferire la proprietà' per arco con CFBridgingRelease(). Così

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

è corretta. E

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

è anche corretto poiché

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

passerebbe un (+1) trattenuto array CGGradientCreateWithColors(). Questa sarebbe una perdita di memoria perché quella funzione non rilascia l'argomento colors.

0

Con NSURL è lo stesso problema

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