PHPz2017-04-21 11:18:12
Core Foundation フレームワーク (CoreFoundation.framework) は、iOS アプリケーションに基本的なデータ管理とサービス機能を提供する C 言語インターフェイスのセットです。以下は、フレームワークが管理のためにサポートするデータと、フレームワークが提供できるサービスのリストです:
グループデータ型 (配列、セットなど)
パッケージ
文字列管理
日付と時刻の管理
生データブロック管理
プリファレンス管理
URL とデータ フローの操作
スレッドとRunLoop
ポートとソケットの通信
Core Foundation フレームワークと Foundation フレームワークは密接に関連しており、同じ機能のインターフェイスを提供しますが、Foundation フレームワークは Objective-C インターフェイスを提供します。 Foundation オブジェクトと Core Foundation タイプを混合すると、2 つのフレームワーク間の「フリーダイヤル ブリッジング」を利用できます。いわゆるフリーダイヤル ブリッジとは、特定のフレームワークのメソッドまたは関数で、Core Foundation および Foundation フレームワークの特定の型を同時に使用できることを意味します。グループ データ型や文字列データ型など、多くのデータ型がこの機能をサポートしています。各フレームワークのクラスとタイプの説明では、オブジェクトがフリーダイヤルでブリッジされるかどうか、またどのオブジェクトにブリッジされる必要があるかが説明されます。
Objective-C ポインターと CoreFoundation ポインター間の変換
ARC は Objective-C ポインター (保持、解放、自動解放) のみを管理し、CoreFoundation ポインターは手動で管理され、CF には自動解放がないことに注意してください。
CocoaFoundation ポインターと CoreFoundation ポインターを変換するときは、ポイントされたオブジェクトの所有権を考慮する必要があります。 ARC には、管理用に 3 つの修飾子が用意されています。
1. __bridge は何もせず、変換するだけです。この場合:
i) Cocoa から Core に変換するには、手動の CFRetain が必要です。そうしないと、Cocoa ポインターが解放された後、渡されたポインターは無効になります。
ii). Core から Cocoa への変換には手動の CFRelease が必要です。そうしないと、Cocoa ポインターが解放された後もオブジェクト参照カウントは 1 のままで、破棄されません。
2. __bridge_retained は、変換後に CFRetain を自動的に呼び出します。これは、上記の状況を自動的に解決するのに役立ちます。
3. __bridge_transfer は、変換後に自動的に CFRelease を呼び出します。これは、上記の ii の状況を自動的に解決するのに役立ちます。
ARC は Core Foundation オブジェクトのライフサイクルを管理できないため、Core Foundation と ARC の間で 3 つの変換キーワード __bridge、__bridge_retained、__bridge_transfer を使用する必要があります。
Apple の公式ドキュメント (https://developer.apple.com/library/i...) によると:
__bridge は型変換のみを実行しますが、オブジェクト (メモリ) の管理権限は変更しません。
__bridge_retained (CFBridgingRetain も使用可能) は、Objective-C オブジェクトを Core Foundation オブジェクトに変換し、同時にオブジェクト (メモリ) の管理を私たちに引き渡します。その後、CFRelease または関連メソッドを使用して、オブジェクト__bridge_transfer (CFBridgingRelease も使用可能) は、オブジェクト (メモリ) の管理を ARC に引き継ぎながら、Core Foundation オブジェクトを Objective-C オブジェクトに変換します。