通話無料でブリッジされた型


互換性のあるように使用できる Core Foundation フレームワークと Foundation フレームワークには多数のデータ型があります。互換性のあるように使用できるデータ型はまた、通話無慮でブリッジされた(toll-free bridged) データ型とも呼ばれます。つまり、Core Foundation 関数呼び出しへの引数または Objective-C メッセージ呼び出しの受信者と同じデータ構造体を使用できる事を意味します。たとえば、NSLocale(NSLocale クラスリファレンス を参照の事) は、Core Foundation の対応する CFLocale (CFLocale リファレンス を参照の事) と互換性があります。


名前の中には、たとえそれがそうだと思われても、すべてのデータ型が通話無料でブリッジされているわけではありません。たとえば、NSRunLoop は CFRunLoop に通話無料ではなく、NSBundle は通話無料で CFBundle にブリッジされておらず、NSDateFormatter は通話無料で CFDateFormatter にブリッジされません。表 1 は、通話無料のブリッジをサポートするデータ型のリストを示しています。


注意: 使用している Core Foundation コレクションに NULL 呼び出しを含む、カスタム呼び出し関数をインストールすると、Objective-C からアクセスするとそのメモリ管理動作は定義されません。


キャストとオブジェクトの寿命の意味


通話無料のブリッジを使用すると、たとえば NSLocale * パラメータがあるメソッドでは CFLocaleRef を渡すことができ、CFLocaleRef パラメータがある関数では NSLocale インスタンスを渡すことができます。また、コンパイラには他の情報も提供する必要があります。まず、一方の型を他方の型にキャストしなければなりません。さらに、オブジェクトの寿命の意味を指定する必要があります。


コンパイラは、Core Foundation 型を返し、歴史的な Cocoa 命名規則に従う Objective-C メソッドを理解します(高度なメモリ管理プログラミングガイド を参照の事)。例えば、コンパイラは、iOS では、UIColorCGColor メソッドによって返された CGColor が所有されていないことを認識します。以下の例に示すように、適切な型キャストを使用する必要があります。


NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];


コンパイラは、Core Foundation オブジェクトの寿命を自動的には管理しません。objc/runtime.h で定義されたキャストまたは NSObject.h で定義された Core Foundation スタイルのマクロのいずれかを使用して、オブジェクトの所有権の意味についてコンパイラに指示して下さい。


以下の例にこれらの一部を示します。


NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
CFStringRef cfIdentifier = CFLocaleGetIdentifier(gbCFLocale);
NSLog(@"cfIdentifier: %@", (__bridge NSString *)cfIdentifier);
// Logs: "cfIdentifier: en_GB"
 
CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (NSLocale *)CFBridgingRelease(myCFLocale);
NSString *nsIdentifier = [myNSLocale localeIdentifier];
CFShow((CFStringRef)[@"nsIdentifier: " stringByAppendingString:nsIdentifier]);
// Logs identifier for current locale


次の例は、Core Foundation メモリ管理関数の使用方法を、Core Foundation のメモリ管理ルールに基づいて示しています。


- (void)drawRect:(CGRect)rect {
 
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGFloat locations[2] = {0.0, 1.0};
    NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
    [colors addObject:(id)[[UIColor lightGrayColor] CGColor]];
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);
    CGColorSpaceRelease(colorSpace);  // Release owned Core Foundation object.
 
    CGPoint startPoint = CGPointMake(0.0, 0.0);
    CGPoint endPoint = CGPointMake(CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds));
    CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint,
                                kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    CGGradientRelease(gradient);  // Release owned Core Foundation object.
}


通話無料でブリッジされた型


表 1 に、Core Foundation と Foundation の間で互換性のあるデータ型のリストを示します。各ペアについて、表には、それらの間の通話無料のブリッジが使用可能になった OS X のバージョンも示します。


表 1 Core Foundation と Foundation の間で互換性のあるデータ型


Core Foundation 型Foundation クラス利用可能
CFArrayRefNSArrayOS X 10.0
CFAttributedStringRefNSAttributedStringOS X 10.4
CFBooleanRefNSNumberOS X 10.0
CFCalendarRefNSCalendarOS X 10.4
CFCharacterSetRefNSCharacterSetOS X 10.0
CFDataRefNSDataOS X 10.0
CFDictionaryRefNSDictionaryOS X 10.0
CFErrorRefNSErrorOS X 10.5
CFLocaleRefNSLocaleOS X 10.4
CFMutableArrayRefNSMutableArrayOS X 10.0
CFMutableAttributedStringRefNSMutableAttributedStringOS X 10.4
CFMutableCharacterSetRefNSMutableCharacterSetOS X 10.0
CFMutableDataRefNSMutableDataOS X 10.0
CFMutableDictionaryRefNSMutableDictionaryOS X 10.0
CFMutableSetRefNSMutableSetOS X 10.0
CFMutableStringRefNSMutableStringOS X 10.0
CFNullRefNSNullOS X 10.2
CFNumberRefNSNumberOS X 10.0
CFReadStreamRefNSInputStreamOS X 10.0
CFRunLoopTimerRefNSTimerOS X 10.0
CFSetRefNSSetOS X 10.0
CFStringRefNSStringOS X 10.0
CFTimeZoneRefNSTimeZoneOS X 10.0
CFURLRefNSURLOS X 10.0
CFWriteStreamRefNSOutputStreamOS X 10.0


前の章 次の章



目次
Xcode 10 の新機能

  • Core Foundation の設計思想への序文
  • この文書の構成
  • 不透明型
  • 不透明型の有利さ
  • オブジェクト参照
  • 多形関数
  • 様々なオブジェクト
  • 命名規則
  • その他の型
  • オブジェクトの比較
  • オブジェクトの検査
  • 通話無料でブリッジされた型
  • キャストとオブジェクトの寿命の意味
    通話無料でブリッジされた型
  • 文書改訂履歴












  • トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)












    トップへ(Core Foundation)