iOSシームレスブリッジ【Apple公式文書の翻訳】

5572 ワード

Toll-Free Bridged TypesCore FoundationフレームワークとFoundationフレームワークには、多くのデータタイプが交互に変換され得る.交互に変換できるデータタイプは、Toll-Free Bridgedデータタイプとも呼ばれる.これは、同じデータ構造をパラメータのように使用して、Core Foundationの関数を呼び出したり、Objective-Cのメッセージ受信モードのように実行したりすることができることを意味する.例えば、NSLocaleは、Core Foundationに対応するCFLocale(CFLocale Referenceを参照)と相互に変換することができる.
すべてのデータタイプがToll-Free Bridgedではなく、その名前がそうと思われても大丈夫です.例えば、NSRunLoopは対応するブリッジタイプCFRunLoopがないので、NSBundleも対応するブリッジタイプCFBundleがない.NSDateFormatterも対応するブリッジタイプCFDateFormatterがない.
文章末尾表1は、シームレスブリッジをサポートするデータタイプのリストを提供します.Core Foundationフレームワークのセットにカスタム・コールを使用すると、NULLコールが含まれ、Objective-Cを使用してアクセスすると、メモリ管理方式が定義されていません.
類型転換と対象語義周期声明
シームレスブリッジ技術によって、NSLocale *をパラメータとする方法の一例では、CFLocaleRef構造体を伝達することができ、CFLocaleRefパラメータの関数を見ると、NSLocaleのインスタンスオブジェクトを転送することができます.もちろん、コンパイラに関する他の情報も提供してください.まず、他のタイプに変えなければなりません.第二に、対象の意味生命周期を指定しなければならないかもしれません.
コンパイラはObjective-Cの方法を理解し、Core Foundationのデータタイプを返します.以下はCocoaの命名変換の履歴です.例えば、コンパイラは、iOSにおいてUIColorCGColorの方法で戻ってくるCGColorが持つべきではないことを知っている.適切なタイプの変換を使用して、次の例のように実証してください.
NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];
コンパイラは、Core Foundationオブジェクトのライフサイクルを自動的に管理しない.コンパイラオブジェクトの意味の所属関係は、変換(objc/runtime.hで定義)またはCore Foundationスタイルのマクロ(NSObject.hで定義されている)を使用することによって伝えなければなりません.
  • __bridgeキーワードは、変換ポインタが所属関係を変換することなくObjective-CCore Foundationの間にあることを示している.
  • __bridge_retainedキーワードまたはCFBridgingRetainは、変換ポインタがObjective-CCore Foundationの間にあることを示し、所属権をあなたに渡す.CFReleaseまたは関連する関数を呼び出して、対象の所属権を渡す責任があります.
  • __bridge_transferキーワードまたはCFBridgingReleaseは、Objective-C以外のポインタをObjective-Cに変換し、ARCに帰属権を変換することを示す.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において利用可能なこれらのシームレスブリッジタイプのバージョンを列挙している.
    Core Foundationタイプ
    Foundationタイプ
    利用可能性
    CFArrayRef
    NSAray
    OS X v 10.0
    CFAttributedStrigRef
    NSAttributedString
    OS X v 10.4
    CFrealendarRef
    NSCalender
    OS X v 10.0
    CFCFChaacterSetRef
    NSCharcterSet
    OS X v 10.4
    CFDATA Ref
    NSData
    OS X v 10.0
    CFDate Ref
    NSDate
    OS X v 10.4
    CFDictionryRef
    NSDictionary
    OS X v 10.0
    CFErrorRef
    NSError
    OS X v 10.4
    CFLocaleRef
    NSLocale
    OS X v 10.0
    CFMutable ArayRef
    NSMutable Aray
    OS X v 10.4
    CFMuttable Attributed StrigRef
    NSMuttable AttributedString
    OS X v 10.0
    CFMutable CharcterSetRef
    NSMutable CharcterSet
    OS X v 10.4
    CFMutable DataRef
    NSMuttableData
    OS X v 10.0
    CFMutable DictionaryRef
    NSMutableDict
    OS X v 10.4
    CFMuttable SetRef
    NSMuteble Set
    OS X v 10.0
    CFMutable StringRef
    NSMutable String
    OS X v 10.4
    CFNumberref
    NSNumber
    OS X v 10.0
    CFReadStreamRef
    NSInputStream
    OS X v 10.4
    CFRunLoop Timerref
    NSTimer
    OS X v 10.0
    CFseetRef
    NSset
    OS X v 10.4
    CFstingRef
    NSString
    OS X v 10.0
    CFTimeZoneRef
    NSTimeZone
    OS X v 10.4
    CFRLRef
    NS URL
    OS X v 10.0
    CFWriteStreamRef
    NSOutputStream
    OS X v 10.4
    表1
    王若風の技術ブログに発表しました.
    参考資料
  • Toll-Free Bridged Types