17

私は色のIDをキャストする "__bridge" を使用して、このコードを持っている:__bridgeと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); 

をだろうが:

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

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

がよりよい解決策になりますか?

答えて

22

あなたはいない「自分の」Core Foundationのは、startColorオブジェクトんendColor彼らはその名前(のための「メモリ管理プログラミングガイドで"The Create Rule"を比較してか、「コピー」、「作成」を持つ関数によって返さない たので、 Core Foundationの」。 そして、あなたは、オブジェクトを所有していないので、あなたはしてはならない " CFBridgingRelease()とARCに" 所有権を譲渡。だから、

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

が正しい。そして

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

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

が(+1)CGGradientCreateWithColors()にアレイを保持して通過するためにも正確です。この関数は引数colorsを解放しないので、メモリ がリークします。 NSURLと

0

は同じ問題

NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"wav"]; 
NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 
AudioServicesCreateSystemSoundID(CFBridgingRetain(soundURL), &soundEffect); 
です
関連する問題