文書   >   Swift   >   Imported C and Objective-C APIs   >   Working with Foundation Types


記事


Working with Core Foundation Types


(Core Foundation 型で作業する)


Swift のコードでメモリ管理された Core Foundation 型を直接操作し、必要に応じて保持を手動で処理します。





概要


Core Foundation フレームワークをインポートすると、その型は Swift クラスとしてインポートされます。メモリ管理注釈が提供されている場合は常に、Swift は、あなた自身がインスタンス化した Core Foundation オブジェクトを含む Core Foundation オブジェクトのメモリを自動的に管理します。Swift では、通話無料でブリッジされた Foundation と Core Foundation の型の各ペアを同じように使用できます。最初にブリッジする Foundation 型にキャストすると、一部の通話無料でブリッジした Core Foundation 型を Swift 標準ライブラリ型にブリッジすることもできます。詳細については、通話無料でブリッジする を参照してください。


メモリ管理されたオブジェクトを使用


Swift が Core Foundation 型をインポートすると、コンパイラはこれらの型の名前を再度マッピングします。すべての Swift クラスは参照型であるため、コンパイラは各型の名前の末尾から Ref を削除します。したがって、接尾辞は冗長です。CFTypeRef 型は、AnyObject 型に完全に再度マッピングされます。


注釈付き API から返された Core Foundation オブジェクトは、Swift で自動的にメモリが管理されます。CFRetainCFRelease、または CFAutorelease 関数はあなた自身で呼び出す必要はありません。


独自の C 関数および Objective-C メソッドから Core Foundation オブジェクトを返す場合、CF_RETURNS_RETAINED または CF_RETURNS_NOT_RETAINED マクロのいずれかを使用してそれらに注釈を付け、メモリ管理呼び出しを自動的に挿入する事ができます。また、CF_IMPLICIT_BRIDGING_ENABLED および CF_IMPLICIT_BRIDGING_DISABLED マクロを使用して、メモリ管理を推測するために、Core Foundation 所有権の命名に関するポリシーに従う C 関数宣言を囲むこともできます。


管理していないオブジェクトをメモリ管理オブジェクトに変換


Swift が注釈の付いていない API をインポートすると、コンパイラは、返された Core Foundation オブジェクトを自動的にはメモリー管理できません。Swift は、返されたこれらの Core Foundation オブジェクトを Unmanagedd<Instance> 構造体にラッピングします。間接的に返される Core Foundation オブジェクトもすべて管理されません。たとえば、以下に注釈のない C 関数があります。


CFStringRef StringByAddingTwoStrings(CFStringRef s1, CFStringRef s2)


これを Swift は、このようにインポートします。


func StringByAddingTwoStrings(_: CFString!, _: CFString!) -> Unmanaged<CFString>! {
    // ...
}


注釈のないA PI から管理されていないオブジェクトを受け取ったら、それで作業する前にすぐにメモリ管理オブジェクトに変換します。そのようにして、Swift はメモリ管理を処理できます。


Unmanaged<Instance> 構造体には、管理されていないオブジェクトをメモリ管理オブジェクトに変換する 2 つのメソッド、takeUnretainedValue() および takeRetainedValue() があります。これらのメソッドは両方とも、オブジェクトのオリジナルの、ラッピングされていない型を返します。呼び出す API が保持されないオブジェクトを返すか保持されているオブジェクトを返すかに基づいて、使用するメソッドを選択して下さい。


たとえば、上記の C 関数が CFString オブジェクトを返さないうちは保持しないとします。オブジェクトの使用を開始するには、takeUnretainedValue() 関数を使用します。


let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()
// memoryManagedResult is a memory managed CFString


管理されていないオブジェクトで retain()release()、および autorelease() メソッドを呼び出すこともできますが、このアプローチはお勧めしません。


詳細については、Core Foundation のメモリ管理プログラミングガイド所有権ポリシー を参照してください。

以下も見よ




ココアフレームワーク

















トップへ












トップへ












トップへ












トップへ












トップへ
目次
Xcode 11 の新機能

  • 言語:Swift
  • 概要
  • 以下も見よ












  • トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)












    トップへ(Window Server Session)