iOSシームレスブリッジ【Apple公式文書の翻訳】
5572 ワード
Toll-Free Bridged Types
すべてのデータタイプが
文章末尾表1は、シームレスブリッジをサポートするデータタイプのリストを提供します.
類型転換と対象語義周期声明
シームレスブリッジ技術によって、
コンパイラは 以下はいくつかの例です.
表1は、
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
Core 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
においてUIColor
のCGColor
の方法で戻ってくる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-C
とCore Foundation
の間にあることを示している.__bridge_retained
キーワードまたはCFBridgingRetain
は、変換ポインタがObjective-C
とCore 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
王若風の技術ブログに発表しました.
参考資料