2012-02-19 14 views
41

CFとNSの両方のオブジェクトが存在する理由を理解しようとしていますが、これは同じことをしているようであり、フリーダイヤルによる相互接続が可能です。例えば、CFArrayとNSArrayが同じことを行い、それらの間で自由にキャストできたら、両方の点は何ですか?いつ他のものを使用するかについての大まかなルールがありますか? CFオブジェクトは古いフレームワークのレガシーオブジェクトだけですか?これについての洞察は非常に高く評価されます。CFオブジェクトとNSオブジェクト

+3

a)すべてのCFタイプがNS同等物を持つわけではなく、その逆もあります。b)接頭辞と同じ名前のものはすべて実際には「フリーダイヤルフリー」ではありません。たとえば、 'CFBundle'と' NSBundle'はそうではありません。詳細は[docs](https://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Toll-FreeBridgin/Toll-FreeBridgin.html)を参照してください。 –

答えて

58

  1. 既存の両方のポイントは何ですか?いくつかの理由があります。

    Carbon APIのようなC APIを提供し、参照カウントオブジェクトの配列や辞書などが必要な場合は、Core Foundation(CFArray)を提供するライブラリが必要ですC APIを持つこと。

    Windowsなどでサードパーティのライブラリを使用する場合は、C APIを提供する必要があります。

    オペレーティングシステムのカーネルとのインタフェースのための低レベルライブラリを作成したいが、Objective-Cメッセージングのオーバーヘッドを望まない場合は、C APIが必要です。

    これは、純粋なCライブラリであるCore Foundationを持つ理由があります。

    Objective-Cでより高いレベルのより快適なAPIを提供したい場合は、配列、辞書、参照カウントオブジェクトなどを表すObjective-Cオブジェクトが必要です。ですからObjective-CライブラリであるFoundationが必要です。

  2. いつどちらか一方を使用する必要がありますか?可能であれば、Objective-Cインターフェイスを使用する方が快適です:myArray.count(または[myArray count])は、CFArrayGetCount(myArray)よりも読みやすく、書きやすいため、Objective-Cクラス(例:NSArray)を使用する必要があります。 Core Foundation APIを使用する必要があるのは、Objective-Cを持たないプラットフォームや、Core Foundation APIが提供するObjective-Cオブジェクトがない機能が必要な場合です。たとえば、参照カウントされていないオブジェクトを格納できるCFArrayまたはCFDictionaryを作成するときにコールバックを指定できます。 NSArrayNSDictionaryのクラスでは、そうすることはできません。常に参照カウントのオブジェクトを格納しているとみなします。

  3. CFオブジェクトはレガシーオブジェクトだけですか?どういたしまして。実際、NextstepはObjective-C Foundationライブラリと(公開)Core Foundationライブラリなしで数年間存在していました。 AppleはCarbon APIとCocoa APIの両方を同じ低レベルのオペレーティングシステム機能の上でサポートする必要があるときに、両方をサポートするためにCore Foundationを作成(または公開)しました。

なお、一部のCore Foundationはオープンソースです。 Mac OS X 10.10.5用のオープンソースの部分は、https://opensource.apple.com/source/CF/CF-1153.18/です。私はCFRunLoopCFStreamのソースコードが非常に有益であることを発見しました。

+0

すごいサマリー、ロブ。ありがとう! – Eric

1

CFはCoreFoundationの略です。その名前にCFを持つ公開オブジェクトは、Cで書かれた単なる通常のCore Foundationオブジェクトです。Objective-Cの土地では、すべてのオブジェクトがCocoa Touch Foundationの友人と無料で結ばれています。それらは通常、不透明なポインタです。

NSはMac OS Xが構築されていた古いOSであるNextStepの略です。 NS接頭辞付きオブジェクトは、通常、Objective-CまたはC、あるいはさらにC++で書かれています。

実際には、それぞれのオブジェクトに何が必要なのかによって異なります。 NSStringを使って純粋なObjective-Cで作業するのは確かに簡単です.CStringとObjective-Cの組み合わせで動作するのですが、CFオブジェクトができることはいくつかあります。 t(主に非常に低レベルのもの)。 CFオブジェクトは、Ref、mu​​tations、inspectionにおいてNSの同等物よりもずっと多くのものを扱うことができます。

(今後、CoreGraphicsのCG、UIKitのUI、QuickLookのQL、AVFoundationのAV、MediaPlayerのMP、MessageFoundationのMF、GLKitのGL、MapKitのMKというプレフィックスがあります)もし私が見逃してしまったら、私は喜んで編集します)。

+2

この回答は基本的には正しいものの、混乱を招く可能性があります。 Core Foundationは「Objective Cベースのオブジェクトを使用しません」。場合によっては、CocoaオブジェクトはCore Foundationオブジェクトを使用して実装されますが、それ以外の方法で実装されることはありません。 CocoaアプリはCoreFoundation.frameworkをリンクする必要があります。 Core FoundationアプリケーションはFoundation.framework(NSStringとそのObjCの友人を提供する)をリンクする必要はありません。 CFを「Appleの内部オブジェクト」と呼ぶこともありません。これらは完全なパブリックAPIであり、コアテキストなどの他のコアフレームワークでよく使用されます。あなたが言うように、CFを必要としない限り、一般的にNSを使うべきです。 –

+0

編集中です。 THanks – CodaFi

+0

CFオブジェクトが静的に割り当てられているとはどういう意味ですか? –

3

この質問にはいくつかの歴史があります。コア基盤は操作の頭脳です。これは主にC言語で書かれています.AppleがNEXTとそのAPIを買収して作成されたもので、多くのことを彼らに負っています。 NS *クラスは、多くの場合、CF *型の上に構築されたObjective C抽象インタフェースです。ですから、CFArrayとNSArrayの両方が存在する理由を尋ねると、答えは実際にはありません。 NSArrays です。CFArrays、NSStrings CFStringsなどです。そのため、フリーダイヤルフリーブリッジが可能です。

もっと興味深く詳細な読書については、this blog postを参照してください。順序であなたの質問に答えるために

11

コア基盤は、さまざまな共通データ構造のC APIです。これらのデータ構造のほとんどは、ココアには同等のものがありますが、それらのすべてではありません。同等のもののほとんどはフリーダイヤルでブリッジされているため、それらのすべてを交換することはできません。

無料通話は、非常に巧妙な実装のトリックです。根本的な詳細が必要な場合は、@Matt Wildingが指摘しているridiculous_fish postを参照してください。これは主題に関する最も権威あるものです(そして、それがどのように機能するかについても説明しているiOS:PTLの第19章への大きな影響)。しかし、それはほとんどの目的のために本当に重要ではありません。マットが指摘しているように、一般にNSArrayCFArrayRefと同じであるとふりまとうことができます。これは多くの場合実際には真実ではありませんが、時には真実であり、ほとんどの場合は十分に近いです。 @"stuff"は、stuffを含むNSStringと同じであるということと同じです。それはほとんど真実ですが、正確ではありません。

OS 9がOS Xに移行したとき、Objective-Cのようなデータ構造にCアクセスを提供するのは非常に便利でした。多くの低レベルのフレームワークでは、パフォーマンス上の理由からC APIが公開されています。 CFを「レガシー」または「内部」と考えるべきではありません。あなたはそれを低レベルと考えるべきであり、それが提供する力を必要とするとき、またはそれを必要とする低レベルのフレームワークを扱うときにのみそれを使うべきです。

CFオブジェクトは、多くの場合、NSオブジェクトよりも柔軟性があります。たとえば、CFDictionaryRefにはオブジェクト以外のキーと値を含めることができますが、NSDictionaryにはできません。 (もちろん、フリーダイヤルでブリッジしているので、非保持のCFDictionaryRefを作成してNSDictionaryとして扱うことができます)。

アップルが新しいフレームワークをリリースすると、最初にC APIを公開し、後でObjective-C APIを追加します。これは、たとえあなたが毎日それを使用しないとしても、Core Foundationを学ぶことは良い考えです。しかし、可能であれば、一般的にObjCを使用する必要があります。

+0

ロブ、大きな説明。あなたは興味深いと思った点を持ち出しました。 @ "string"と "string"を含むNSStringの違いは何ですか?私は@ "文字列"が暗黙的なNSStringにあると考えました... – Eric

+5

@ "文字列"は実際には 'NSString'の(ソート)サブクラスである' __NSCFConstantString'です。 (フリークエンシー・ブリッジ・クラスであるため、ソート・オブ・ブリッジ・クラスであり、サブクラスとまったく同じではありません)。定数文字列は、ヒープではなく__TEXTセグメントにあります(別々に格納される基になるcstringとともに) 'retain'と' release'呼び出しを無視します。 –

関連する問題