IOSのCore FoundationフレームワークとCocoa Foundationフレームワークの違い
__bridge
id obj = [[NSObject alloc] init];
void *p = (__bridge void *)obj;
id o = (__bridge id)p;
bridge_retained
__bridge_transfer
__bridge_retained :
id obj = [[NSObject alloc] init];
void *p = (__bridge_retained void *)obj;
: , 。 ARC , :
id obj = [[NSObject alloc] init];
void *p = obj;
[(id)p retain];
, 。
void *p = 0;
{
id obj = [[NSObject alloc] init];
p = (__bridge_retained void *)obj;
}
NSLog(@"class=%@", [(__bridge id)p class]);
,p 。 , 。
_bridge_transfer
ARC , 。
// p
id obj = (id)p;
[obj retain];
[(id)p release];
ARC , :
// p
id obj = (__bridge_transfer id)p;
,__bridge_retained retain , __bridge_transfer release1
, 。 Core Foundation Objective-C , __bridge_transfer 。
Toll-Free bridged
iOS , :Objective-C Core Foundation 0。Core Foundation C Core Foundation Framework , , Cocoa Framework::Foundation Framework retain/release, CFRetain/CFRelease 。
, ARC , C , CPU , Toll-Free bridged。 NSArray CFArrayRef, NSString CFStringRef, Framework, , C 。
ARC , :
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (CFStringRef)string;
,Core Foundation Objective-C , C 。
ARC , :
Cast of Objective-C pointer type ‘NSString *’ to C pointer type ‘CFStringRef’ (aka ‘const struct __CFString *’) requires a bridged cast
Use __bridge to convert directly (no change in ownership)
Use __bridge_retained to make an ARC object available as a +1 ‘CFStringRef’ (aka ‘const struct __CFString *’)
エラーでは、どのようにする があるかが されています.bridgeまたは_bridge_retainedがモデルチェンジし、その いはオブジェクトの を することです.
Objective-CはARC の であり、Core FoundationはARC の ではないので、わざわざこのように するのは、idタイプからvoid*への という です.つまり、この2つのタイプ(ARC があり、ARC がない)が された 、コンパイラにオブジェクトの をどのように するかを える があります.
の では、__を します.bridge/__bridge_retained のコードは のとおりです.
NSString *string = [NSString stringWithFormat:...]; CFStringRef cfString = (__bridge CFStringRef)string; にタイプ を しただけで、 の は われず、すなわちstringオブジェクトが されるとcfStringも できなくなる.
NSString *string = [NSString stringWithFormat:...]; CFStringRef cfString = (__bridge_retained CFStringRef)string; ... CFRelease(cfString);//Core FoundationのオブジェクトはARCの であるため、 releaseで する があるbridge_retainedは、ターゲット(cfString)のretain を することによって、 を させることができる.string が されても、cfStringは のオブジェクトを することができます.ただ つ、Core Foundationの はARCの ではないので、 でreleaseする があります.
,Core Foundation では,Core FoundationオブジェクトタイプとObjective-Cオブジェクトタイプの を するために, の が されている.
CFTypeRef CFBridgingRetain(id X) { return (__bridge_retained CFTypeRef)X; }
id CFBridgingRelease(CFTypeRef X) { return (__bridge_transfer id)X; } って、CFBridgingRetainで することができる_bridge_retainedキーワード:
NSString *string = [NSString stringWithFormat:...]; CFStringRef cfString = CFBridgingRetain(string); ... CFRelease(cfString);//Core FoundationはARC の なので、 にreleaseする があります._bridge_Transfer が すると、 された はオブジェクトの を います.Core FoundationオブジェクトタイプがObjective-Cオブジェクトタイプに される 、よく されます_bridge_transferキーワード.
CFStringRef cfString = CFStringCreate...(); NSString *string = (__bridge_transfer NSString *)cfString;
//CFRelease(cfString); もう ってるからbridge_Transferはオブジェクトの を するのでreleaseを び す はありません. に、CFBridgingRelease()を して__の わりに できます.bridge_transferキーワード.
CFStringRef cfString = CFStringCreate...(); NSString *string = CFBridgingRelease(cfString); まとめ の からARCにおけるタイプ の い がわかったので、 にどのような や で い けているのか、いくつかの な をまとめました.
タイプがARC のオブジェクトCore FoundationオブジェクトタイプがARC カテゴリ でないことを にするCocoa Framework::Foundationオブジェクトタイプ( に されるObjectie-Cオブジェクトタイプ)ARCの カテゴリ でARC カテゴリ でないオブジェクトは、ではreleaseの は の なオブジェクトのライフサイクルがどのようなものかを らかにしなければならない.がid objを したとき、 はデフォルトの が1つありました_strong の なので、コンパイラはretainの を に えたので、_bridge_Transferキーワードはrelease のみをしてくれました.
Objective-CポインタとCoreFoundationポインタ の
ARCはObjective-Cポインタ(retain、release、autorelease)のみを し、CoreFoundationポインタは しません.CFポインタは で し、 のCFReatainとCFReaseで します. 、CFにはautoreleaseはありません.
CocoaFoundationポインタはCoreFoundationポインタに され, の を する がある.ARCは3つの を して する.
1. __bridge、 もしないで、ただ します.この :
i). CocoaからCoreに するには, CFRetainが であるが,そうでなければCocoaポインタが された , されたポインタは である.
ii). CoreからCocoaに するには、 CFReaseが です.そうしないと、Cocoaポインタが された も、オブジェクト カウントは1であり、 されません.
2. __bridge_retainedは、 にCFRetainを に び す、すなわち、 iの を に するのに つ.
2. __bridge_Transferは, にCFRelaseを に び す,すなわち iiの を に するのに つ.
アップル ドキュメント