その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

リファクタリング講座メモ

5/29にRainbowApps卒業生の方が主催された合宿に参加した際、そこでバスケさんが話されていた「公開リファクタリング講座」が非常にためになる内容だったので、そのときのメモを公開しておきます。

メモリまわりのデバッグ/リファクタリング

  • leaksが有名なのでそればかり使いがちだが、memory allocationやzombiesでも見てみること
    • live bytesが使用中のメモリ量
    • 1.5Mぐらいなら画像使用してるアプリなら多くない
    • 13Mになると、初代ipadなら落ちる可能性ある
    • live bytesでソートすると、今一番メモリくってるオブジェクトタイプがわかる
  • breakpointを右クリックでエディットできる
    • アクションの設定・・・10回通った後で止まる、とか。


  • バンドルからplistを読み込む動作は重い(一時オブジェクトが生成されるのでメモリ空間も汚れる)ので基本的には1度しかやらないこと

UIViewcontroller作成時の注意点

  • xibファイル名はクラス名と同じにする。同じ名前のxibファイルがあれば、initメソッドでnibからインスタンス化される(initWithNib〜とか書かなくてよい)
  • ヘッダには公開すべき内容だけ書く。外部に知らせる必要のないプロトコル名とかはクラスエクステンション機能を利用して.mに書く
    • プロトコル準拠もメンバ変数もここで宣言できる。
    • クラスエクステンションのフル機能を使うには、コンパイラにLLVMを選んでいる必要がある
@interface {class name}()
<UIAlertViewDelegate>
@end
  • プロパティ宣言しているものはメンバ変数の欄に書く必要がない
  • アウトレットも含め、すべてプロパティで管理する。処理のペナルティもないしメモリ管理が楽になる
  • viewDidUnloadでビューをself.xxx = nil;して、deallocで[self viewDidUnload];をコールする
    • この作法はappleからの回答もなくずっとグレーゾーンだったが最近海外の有名ライブラリはみんなこうしてる
    • viewDidUnloadを継承したら[super viewDidUnload];を必ずやること
  • Xcode4からGCCの代わりにLLVMが選べるようになった。
    • LLVMを利用するメリット
      • アップルは全てLLVMでコンパイルしてると宣言してる
      • クラスエクステンションのフル機能
      • コンパイラが賢い
      • デバッガも賢い
  • ViewController同士でお互いの参照を持つ構成は絶対だめ。解放されない。
  • デリゲートの代わりにKVO(key value observing)がおすすめ
    • NSNotificationを簡単にやるようなしくみ
    • キーとなる値(プロパティ)を監視する(キーパス:オブジェクトの値へのパス)
    • NSNotificationより粒度を細かくできる