17

Ich habe diesen Code, der "__bridge" werfen die IDs von Farben verwendet:Wann sollten Sie __bridge vs. CFBridgingRelease/CFBridgingRetain verwenden?

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

aber würde:

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

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

werden, um eine bessere Lösung?

Antwort

22

Sie haben keine „eigene“ die Core Foundation-Objekte startColor, endColor weil sie nicht durch eine Funktion zurückgegeben, die „Create“ oder „Kopieren“ in seinem Namen (vgl "The Create Rule" im „Memory Management Programming Guide hat für Core Foundation“. Und weil Sie die Objekte nicht besitzen, müssen Sie nicht "übertragen das Eigentum" mit CFBridgingRelease() ARC. So

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

ist richtig. Und

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

ist auch richtig, weil

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

eine (+1) zurückgehalten Array CGGradientCreateWithColors() passieren würde. Dies wäre ein Speicher Leck, weil diese Funktion das colors Argument nicht freigibt.

0

Mit NSURL ist das gleiche Problem

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