きりかノート 3冊め

おあそびプログラミング

第61回 Cocoa勉強会に行ってきた(9/7)

会場は今回も新宿伊藤ビルの貸し会議室

以下発表など。

「メインスレッド外でNSURLConnection」iOS/Mac

"NSURLConnectionはメインスレッドじゃないと使えない"という通説があるけれども、そんなことはないよ、という話。

  • delegateをふつうに実装するとメインスレッドで実行されるためUIのパフォーマンスに影響してしまう。
  • GCD/NSOperationが並行実行にきょうび使われるテクニック。
  • [connection setDelegateQueue:], [connection start]しないと操作が実行されないことに注意!
    • iOS6以降(iOS5はバグってて動かない)、Lion以降
  • RunLoopでがんばる方式も確立されてて、旧バージョンのOSだと有効。

(感想?)ASIHTTPRequest開発止まっちゃったよね〜という話もあったけど、今よく使われてるAFNetworkingはどうなのかしらん。

「ARCにおけるRetainCountのデバッグ」Generic

メモリリークを力技で調査する話。

  • CFGetRetainCount()でretain countを調べる。
  • method swizzlingでretain/release/dealloc中に仕込む。
    • コールスタックも-[NSThread callStackSymbols]で取得しておく。

実際にリーク50超という状態をこの方法で調べて解消することができた。
主な原因はNSManagedObjectContextのbind時のretain。明示的にunbind:が必要。ARCだってリークするよ。

(質疑応答)

  • [Q]Instrumentsで調査できなかったけ?
  • [A]Instruments使ってないので…次回?Instrumentsの使い方の発表が期待されています。

(感想)ログ出力を加工して見やすくするスクリプト書けば便利そう。

「状態の保存と復元」iOS

iOS6から導入された、State Preservation and Restorationの機能とAPIについて。

  • 動作
    • アプリがバックグラウンドに→保存
    • アプリがアクティブに→復元
    • アプリが終了→状態を破棄
  • 保存の対象はビューコントローラ(+ビュー)、アプリケーションデータはここで保存しないことが推奨されている。
  • XIB上でビューコントローラの"Restoration ID"でIDを付与。

サンプルによるデモ。

(質疑応答)

  • [Q]アプリをアップデートしたときの動作は?
  • [A]一度アプリが終了するので(なにもしなければ)初期画面が表示される。
  • [Q]復元をキャンセルすることはできる?
  • [A]delegateメソッドで復元するかどうかを選択できる。

(関連の話題)

アラートやシートを復元時に表示するかどうか。
そのままなら復元する。Appleは復元時には非表示にしているようだが、そのように実装するのはけっこう大変。

複数アラートでてるときの処理とかは…?→アラートは必ず1つしか出さないよう制御する派がちらほら。

「CocoaPods基礎編」iOS/Mac

ライブラリ管理ユーティリティCocoaPodsの導入と使い方について。

以下が決め手となって使っている。

  • ソース、リソース、ライブラリの管理が容易に。
  • バイナリのライブラリのみが提供されるケースや、非公開の自社ライブラリも管理できる。

実際のセットアップ、アプリをcocoapodsに移行させる、ライブラリのバージョンアップのデモ。
直接ターゲットのプロジェクトに組み込むのでなくワークスペースを利用してpodの静的ライブラリをビルドする別プロジェクトを用意するようになっていたり、.xcconfigを利用するなど実際にどのように実現されているかを説明。

podの探し方

  • cocoaobjects, cocoacontrolsを見たり、評判の良いものを試してみたりなど。
  • searchコマンドで探すのは無理。

(質疑応答)

  • [A]使ってみた印象では問題なさそう。
  • [Q]画像などのリソースは?
  • [A]ビルドフェーズでコピーされるようになっている。
  • [Q]Podsのプロジェクトのコード等もバージョン管理システムに入れる?
  • [A]入れている。ただこれはポリシー次第で、Podfileのみでもよい(はず?)
  • [Q]Subversionのexternalsやgitのsubmoduleでも実現可能では?
  • [A]以前はそのようにしていたがCocoaPodsのほうが扱いやすい。

次回は実践編。podの作成〜公開、社内のみでの利用の手法など。

(感想)プロジェクトがどのように操作されることで実現されてるかの説明があっていろいろ納得。うまくできてるねえ。面白かったのが、「バージョンが0.24とかで"そんなバージョン番号のソフト使えるの?"という点で社内の説得に苦労した(うろ覚え)」という話。「バージョン1.0以上じゃないと使えない」という信念を持ってる人はけっこういて、バージョン番号そのものにあまり意味がないと考えてる人との断絶はどーにもならんのよねえ。
RubyCocoaも0.5の次を1.0にする予定だったけど、ずるずると0.13までいっちゃったりしたことを思い出したり。。

その他

NSURLのpath操作

[NSURL URLByAppendingPathComponent:]がNSStringと動作が異なっててハマった。

  • http://foo/ + /bar => http://foo//bar 古いiOSのバージョンのみで起きる
  • サーバによってはURLを補正してくれる(Apacheなど)ので問題が再現したりしなかったりでハマる

そもそもNSStringと比べてNSURLのappending...は遅いので注意。
また、fileスキーマではパスにディレクトリが実在するかで結果が変わったりするので注意。

インスタンス変数の可視性

カテゴリでのインスタンス変数へのアクセスには明示的に変数の宣言が必要。プロパティを宣言しただけでは内部変数は可視でないのでカテゴリ実装中ではアクセスできない。(コンパイルエラー)

次回の予定

未定です。10月か11月あたりになるかと。

(9/15 追記)10/19(土)に水道橋で行います!