IOSのCore FoundationフレームワークとCocoa Foundationフレームワークの違い

5563 ワード

Objective-CオブジェクトとCore Foundationオブジェクトは2種類あり、ARC以外の場合は互いに変換可能(標準Cタイプで変換可能)ARCでは、(Core FoundationではARCはサポートされていません)用_bridgeまたは_bridge_retainedがモデルチェンジし、その違いはオブジェクトの所有権を変更することです.Core Foundationフレームワーク(CoreFoundation.framework)は、iOSアプリケーションに基本的なデータ管理とサービス機能を提供するC言語インタフェースのセットです.以下に、このフレームワークが管理をサポートするデータおよび提供可能なサービスを列挙する:集団データ型(配列、集合など)パッケージ文字列管理日時管理元データブロック管理選好管理URLおよびデータストリーム操作スレッドおよびRunLoopポートおよびsoket通信

__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の を に するのに つ.
    アップル ドキュメント