投稿

XcodeのAssistant EditorのManualを、選べない状態から正常な状態にする

イメージ
Xcodeを使っていて困ることの一つにAssistant EditorのManualが正常に機能しないということがあります。どういうことかというと 通常は このようにManualの下にProjectがあり、その下にある任意のファイルを選べるようになっています。 しかし、ときどき このようになり、現在選ばれているものから変更出来ない状態になります。 ここから正常な状態に復帰させる(ことが出来るかもしれない)手順です。 Xcode6.2 OSX10.9 で確認しております。他の環境では出来ない可能性もあります。 1,まずManual以外のものを選択し表示を切り替えます。 2,一旦Assistant Editorを閉じます。 3,再びAssistant Editorを表示させます。 4,Manualが正常に戻る(かも)。 自分の環境では100%修正可能でしたが、どんな環境でも必ず正常に復帰できるかどうかはわかりません。参考になれば。 ちなみに、そもそも何故不安定な状態になるかですが、いろいろやってみたところ"Manual"自体をクリックしたときの制御が不安定のようです。Manualにして何かのファイルを表示したいときはマウスで目的のファイルまで辿り着いてからクリックするとこの不安定なポイントを避ける事が出来ます。

UIFontのfontName一覧 iOS8版

参考記事 Over&Out その後 UIFontのfontName一覧 これのiOS8版を行います。 ""が付いているものと付いていないものがありますが、どちらも指定できます。 使用例 [UIFont fontWithName:@"Courier" size:512]; family:Marion ( "Marion-Italic", "Marion-Bold", "Marion-Regular" ) family:Copperplate ( "Copperplate-Light", Copperplate, "Copperplate-Bold" ) family:Heiti SC ( "STHeitiSC-Medium", "STHeitiSC-Light" ) family:Iowan Old Style ( "IowanOldStyle-Italic", "IowanOldStyle-Roman", "IowanOldStyle-BoldItalic", "IowanOldStyle-Bold" ) family:Courier New ( "CourierNewPS-BoldMT", "CourierNewPS-ItalicMT", CourierNewPSMT, "CourierNewPS-BoldItalicMT" ) family:Apple SD Gothic Neo ( "AppleSDGothicNeo-Bold", "AppleSDGothicNeo-Thin", "AppleSDGothicNeo-UltraLight", "AppleSDGothicNeo-Regular...

bridge系のキャスト

よく忘れてしまうので… 何がカウンタ方式か ARC obj-cでも非ARC obj-cでもCF系(CoreFoundation系)でも全部カウンタ方式。プログラマが管理文を書くか書かない(コンパイラが書く?)かの違いはある。 カウンタはどこで持つか 2つの変数が同じインスタンスを参照している時カウンタはいくつか? 1つ。 __bridge系って何? id系とCF系のキャストの箇所でコンパイラがretainとreleaseをどう書くかを指定するもの。 __bridge __bridge_retained __bridge_transfer の3つ。 何をどう使ってもretainとreleaseがきちんと数を合わせて実行されてれば間違いではないと思いますが、3種類あるのは、人が見てわかりやすいとか、下で書くような管理責任をどうしたいのかを表すのには便利かと思います。 オーナーシップについて オーナーシップという言葉で説明してあるものがかなりあります。もしよくわからない場合は、一旦retain releaseの追加という観点で理解してから、再度オーナーシップについて考えるのがおすすめです。 それぞれのパターンでキャストして代入するとこうなります。 __bridgeによるCF系からid系 id系 = (__bridge id系)CF系 id系がARC管理下に入ることによりカウンタ+1。ただし__weakであれば増加処理はなし。 キャスト後もCF系で管理したいときにおすすめ。id系が消えたあともCF系を使いたい時など。 __bridgeによるid系からCF系 CF系 = (__bridge CF系)id系 カウンタ変わらず 引き続きid系による(自動)管理をしたいときにおすすめ。キャスト後のCF系は管理しないことが前程だが一応管理命令は実行出来る。 __bridge_retainedによるid系からCF系 CF系 = (__bridge_retained CF系)id系 CF系がretainされるので+1 キャスト後のCF系で管理したいときにおすすめ。 id系は引き続き管理されている。 __bridge_transferによるCF系からid系 id系 = (__bridge_transfe...

Interface「新時代コンパイラ入門」はよかった

Interface2015年3月号は「高性能でフリー!新時代コンパイラ入門」特集。 Swiftのコンパイルエラーの記事を書いたこともあって買ってみました。 変なハショリなどもなく読みやすかったです。 話に出てくるコンパイラはいさぎよくGCCとLLVMに絞ってあります。 コンパイルの各工程の解説が書かれています。 対象読者は普段プログラムをされている方か昔されていた方。そうでない方だと意味のわからないアルファベットが大量に出てくる状態になってつらいかもしれません。 対象とする前程知識はかなり基本的なコンパイラの知識で十分です。 ・コンパイルとはプログラムを解釈してCPUへの命令に置き換える作業 ・ARMとはCPUの設計をする会社 ・ARMが作ったものにはv7やv8などがある 程度でOKでした。 自分が読んだ部分はSwiftでの開発に関係ありそうなところだけで イントロダクション Appendix 1 第1章〜第6章 でした。 Clangの機能の使い方についての説明があった。これはブログで記事を書くのに役に立ちそう。

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(AVAudioSessionCategoryPlayba...

AVMIDIPlayer

iOSのAPIの中にAVMIDIPlayerというものを発見。これは音楽ファイルを再生するもので、対象フォーマットはMIDIとiMelody。iMelodyというのは着メロのような単音の音楽を扱うものらしい。所属はAVFoundationでiOS 8より追加になった。 初期化メソッドは2つ。 initWithContentsOfURL: soundBankURL: error: initWithData: soundBankURL: error: 上のメソッドでは1つ目の引数はファイルのURLを渡し、2つ目の引数でsoundBankというもののURLを渡す。2つ目のsoundBankURLだが、これは再生に使う音源の指定でSoundFont2かDLS bank(のURL)を指定する。OS Xではnilが可能だが、iOSではnilはだめ。 下のメソッドでは1つ目の引数はNSDataインスタンス(の形式にした音楽ファイル)を渡す。2つ目以降は上のと同じ。 SoundFont2は音色のデータフォーマット。世の中でよく(?)使われている。DLSも音色のデータフォーマットだがSoundFont2の方がメジャー。 再生データ(第一引数)と音色データ(第二引数)の違いがややこしいと思う。音色データにはいろいろな音色のいろいろな音程の音が含まれている。それをどのタイミングでどの音を鳴らすかを指定するのが再生データ。 再生関係メソッドは普通に play: stop prepareToPlay playの引数で再生完了時に実行する処理を渡せる プロパティは playing (再生中かどうか readOnly) duration (全体の時間 readOnly) currentPosition (現在ポジション 読み書き可能) そのほかに、MIDIらしく rate (再生速度、1.0が標準 読み書き可能) というものがある。 手持ちのMIDIファイルとダウンロードしたSoundFontで鳴らしてみたらiPad mini 2から音が出ました。まあ普通に再生出来ています。複数チャンネルにも対応しています。 しかしこうなるとiOSに初めから手頃な音源が搭載されていて欲しくなります。