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すればいいのかなと思うのだが、今後の課題。