Archive for 9月 7th, 2013
2013-09-07 61回 Cocoa勉強会(関東)のレポート
会場は新宿伊藤ビルの貸し会議室でした。
以下発表など。
「メインスレッド外でNSURLConnection」iOS/Mac
“NSURLConnectionはメインスレッドじゃないと使えない”という通説があるけれども、そんなことはないよ、という話。
- delegateをふつうに実装するとメインスレッドで実行されるためUIのパフォーマンスに影響してしまう。
- GCD/NSOperationが並行実行にきょうび使われるテクニック。
- [connection setDelegateQueue:]\, [connection start]しないと操作が実行されないことに注意!
– iOS6以降(iOS5はバグってて動かない)、Lion以降 - RunLoopでがんばる方式も確立されてて、旧バージョンのOSだと有効。
「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の導入と使い方について。
- プロジェクトで利用するライブラリを管理する仕組み。
- Rubyのbundlerみたいの。
- コマンドラインで操作する。
以下が決め手となって使っている。
- ソース、リソース、ライブラリの管理が容易に。
- バイナリのライブラリのみが提供されるケースや、非公開の自社ライブラリも管理できる。
実際のセットアップ、アプリをcocoapodsに移行させる、ライブラリのバージョンアップのデモ。
直接ターゲットのプロジェクトに組み込むのでなくワークスペースを利用してpodの静的ライブラリをビルドする別プロジェクトを用意するようになっていたり、.xcconfigを利用するなど実際にどのように実現されているかを説明。
podの探し方
- cocoaobjects, cocoacontrolsを見たり、評判の良いものを試してみたりなど。
- searchコマンドで探すのは無理。
(質疑応答)
- Q.画像などのリソースは?
- A.ビルドフェーズでコピーされるようになっている。
- Q.Podsのプロジェクトのコード等もバージョン管理システムに入れる?
- A.入れている。ただこれはポリシー次第で、Podfileのみでもよい(はず?)
- Q.Subversionのexternalsやgitのsubmoduleでも実現可能では?
- A.以前はそのようにしていたがCocoaPodsのほうが扱いやすい。
次回は実践編。podの作成〜公開、社内のみでの利用の手法など。
その他
NSURLのpath操作
[NSURL URLByAppendingPathComponent:]がNSStringと動作が異なっててハマった。
- http://foo/ + /bar => http://foo//bar 古いiOSのバージョンのみで起きる
- サーバによってはURLを補正してくれる(Apacheなど)ので問題が再現したりしなかったりでハマる
そもそもNSStringと比べてNSURLのappending…は遅いので注意。
また、fileスキーマではパスにディレクトリが実在するかで結果が変わったりするので注意。
インスタンス変数の可視性
カテゴリでのインスタンス変数へのアクセスには明示的に変数の宣言が必要。プロパティを宣言しただけでは内部変数は可視でないのでカテゴリ実装中ではアクセスできない。(コンパイルエラー)
(reporter: kimuraw)