投稿

12月, 2014の投稿を表示しています

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

AVAudioSession細かいことまとめ(late 2014)

以前も書きました「AudioSessionの細かいことまとめ」のlate 2014版を書きます。

個人的なあらすじ以前アプリを作る際に、AudioSession(C言語)とAVAudioSession(Obj-C)のどちらを使おうかと検討したことがありました。そのときはAVAudioSession(Obj-C)の方に機能が足りない部分が多少あって、これは主流にならないのではと思い、AudioSession(C言語)の方で実装しました。しかし予想は外れ、AudioSession(C言語)の方がiOS7より非推奨となったので、今回改めてAVAudioSession(Obj-C)の方でまとめてみます。せっかくなのでSwiftの方も併記して書いてみようと思います。基本的にAVAudioSessionのクラスリファレンスを読んでまとめるだけなので詳しく知りたいことがある場合はそちらを見て下さい。
ちなみに作っているアプリはSilentBonusTrackというカセットテープアプリで、iPodのような音楽再生機能が中心となっています。私の興味の対象はその辺の音楽再生系が中心になります。

重要な項目まずは音を扱う場合には目を通しておく必要があるAudioSession関係です。

importするもの//Swift import AVFoundation //Objective-C #import <AVFoundation/AVFoundation.h>
インスタンスの取得このインスタンスに対して音の扱いに関するいろいろなメソッドを実行出来ます。
//Swift let session: AVAudioSession = AVAudioSession.sharedInstance() //Objective-C AVAudioSession *audioSession = [AVAudioSession sharedInstance]; Swiftの方はもしvarにする必要があればvarにしてください。

カテゴリーの指定アプリの音の扱い方法を数パターンの中から選んで指定します。
//Swift var error: NSError? session.setCategory(AVAudioSessionCategoryPlayback,error:&error) //O…