通話無料でブリッジされた型
互換性のあるように使用できる Core Foundation フレームワークと Foundation フレームワークには多数のデータ型があります。互換性のあるように使用できるデータ型はまた、通話無慮でブリッジされた(toll-free bridged) データ型とも呼ばれます。つまり、Core Foundation 関数呼び出しへの引数または Objective-C メッセージ呼び出しの受信者と同じデータ構造体を使用できる事を意味します。たとえば、NSLocale(NSLocale クラスリファレンス を参照の事) は、Core Foundation の対応する CFLocale (CFLocale リファレンス を参照の事) と互換性があります。
名前の中には、たとえそれがそうだと思われても、すべてのデータ型が通話無料でブリッジされているわけではありません。たとえば、NSRunLoop は CFRunLoop に通話無料ではなく、NSBundle は通話無料で CFBundle にブリッジされておらず、NSDateFormatter は通話無料で CFDateFormatter にブリッジされません。表 1 は、通話無料のブリッジをサポートするデータ型のリストを示しています。
キャストとオブジェクトの寿命の意味
通話無料のブリッジを使用すると、たとえば NSLocale * パラメータがあるメソッドでは CFLocaleRef を渡すことができ、CFLocaleRef パラメータがある関数では NSLocale インスタンスを渡すことができます。また、コンパイラには他の情報も提供する必要があります。まず、一方の型を他方の型にキャストしなければなりません。さらに、オブジェクトの寿命の意味を指定する必要があります。
コンパイラは、Core Foundation 型を返し、歴史的な Cocoa 命名規則に従う Objective-C メソッドを理解します(高度なメモリ管理プログラミングガイド を参照の事)。例えば、コンパイラは、iOS では、UIColor の CGColor メソッドによって返された CGColor が所有されていないことを認識します。以下の例に示すように、適切な型キャストを使用する必要があります。
NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]]; [colors addObject:(id)[[UIColor lightGrayColor] CGColor]];
コンパイラは、Core Foundation オブジェクトの寿命を自動的には管理しません。objc/runtime.h で定義されたキャストまたは NSObject.h で定義された Core Foundation スタイルのマクロのいずれかを使用して、オブジェクトの所有権の意味についてコンパイラに指示して下さい。
- __bridge は、Objective-C と Core Foundation の間で、所有権の移転なしにポインタを転送します。
- __bridge_retained または CFBridgingRetain は、Objective-C ポインタを Core Foundation ポインタにキャストし、また所有権をあなたに転送します。
- __bridge_transfer または CFBridgingRelease は Objective-C 以外のポインタを Objective-C に移動し、また所有権を ARC に転送します。
あなたは、オブジェクトの所有権を放棄するために CFRelease または関連する関数を呼び出す責任があります。
ARC はオブジェクトの所有権を放棄する責任があります。
以下の例にこれらの一部を示します。
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 クラス | 利用可能 |
CFArrayRef | NSArray | OS X 10.0 |
CFAttributedStringRef | NSAttributedString | OS X 10.4 |
CFBooleanRef | NSNumber | OS X 10.0 |
CFCalendarRef | NSCalendar | OS X 10.4 |
CFCharacterSetRef | NSCharacterSet | OS X 10.0 |
CFDataRef | NSData | OS X 10.0 |
CFDictionaryRef | NSDictionary | OS X 10.0 |
CFErrorRef | NSError | OS X 10.5 |
CFLocaleRef | NSLocale | OS X 10.4 |
CFMutableArrayRef | NSMutableArray | OS X 10.0 |
CFMutableAttributedStringRef | NSMutableAttributedString | OS X 10.4 |
CFMutableCharacterSetRef | NSMutableCharacterSet | OS X 10.0 |
CFMutableDataRef | NSMutableData | OS X 10.0 |
CFMutableDictionaryRef | NSMutableDictionary | OS X 10.0 |
CFMutableSetRef | NSMutableSet | OS X 10.0 |
CFMutableStringRef | NSMutableString | OS X 10.0 |
CFNullRef | NSNull | OS X 10.2 |
CFNumberRef | NSNumber | OS X 10.0 |
CFReadStreamRef | NSInputStream | OS X 10.0 |
CFRunLoopTimerRef | NSTimer | OS X 10.0 |
CFSetRef | NSSet | OS X 10.0 |
CFStringRef | NSString | OS X 10.0 |
CFTimeZoneRef | NSTimeZone | OS X 10.0 |
CFURLRef | NSURL | OS X 10.0 |
CFWriteStreamRef | NSOutputStream | OS X 10.0 |
前の章 次の章