Unmanaged Objects

Swiftはいろいろと新しい設計がしてあって便利なんだけど、既存のものとの互換性という点で困ることがよくある。今回の内容もそのひとつ。メソッドの実行結果としてCore Foundationを受け取ってしまったとき。
返されたCore Foundationオブジェクトはおそらくメモリ管理がされていないUnmanaged<T>という型(?)となっている。Swiftはこのままでは使うことが出来ず、プログラマがこれをretainタイプ(CF_RETURNS_RETAINED)か非retainタイプ(CF_RETURNS_NOT_RETAINED)に決定してやる必要がある。これをするにはそのオブジェクトに対して
takeUnretainedValue()

takeRetainedValue()
を実行してやる。

説明に載っていた使用例は以下の通り
func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!
let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()

ポイントはretainタイプか非retainタイプかをどう判断すればいいのかということ。自分のプログラム内での使われ方から判断し、retainが必要ならretainすればいいのかなと思うのだが、今後の課題。

コメント