色々こんがらがってきたので、自分なりの決めごとや注意点をメモ。
1回しか代入しないようなインスタンス変数、例えば他のビューコントローラーを保持するような場合は、インスタンス変数に格納。
dealloc等でreleaseしてnilを代入する。
プロパティにしても良いが、いちいち@synthesizeするのも面倒なんだよなあ。
何回も代入されるようなインスタンス変数、例えばNSStringなどは、開放処理とか面倒なので、プロパティとして定義する。
サンプルを見ると@interfaceにもインスタンス変数として記述しなくてはいけないような事が書いてあるが、@propertyにだけ書いても特に問題無くビルド&実行できるので、面倒なので@interfaceには書かない。
いずれにせよ、クラス内でしか使われない変数は、_で変数名を始める。
IBOutletしたものもdealloc等でちゃんとreleaseしてnilを代入する。@propertyで定義したものはnilを代入するだけで良い。
基本的に自分でallocしたものではないオブジェクトはautoreleaseされてると考えて良い。
このようなオブジェクトをインスタンス変数に保持する場合は、ちゃんとretainする。
ビューコントローラーは必要になったら作成する。
MainWindow.xibとかで全部定義しておくと、起動に時間がかかってしまう。
UINibで作成したビューコントローラをpushした直後にreleaseは必要無い。
カスタムUIViewについて。
xib中に置いたオブジェクトの初期化はinitWithCoderとawakeFromNibで。何故かinitやinitWithFrame等は呼ばれない。
使い分けとしては、initWithCoder直後はIBOutlet等で接続したオブジェクトは作られてないので、それらの初期化はawakeFromNibのほうで行う。
全部awakeFromNibで行えば良いと錯覚しがちだが、awakeFromNibが呼ばれるタイミングはxibファイルがロードされ終わってから一斉に、のようなので、カスタムUITableViewCellの中でIBOutletしているカスタムUIViewのawakeFromNibの方が先に呼ばれてしまい、カスタムUITableViewCellでカスタムUIViewを初期化しても、その直後にカスタムUIViewが自分自身を初期化しなおしてしまうという現象が起こり得る。
コード中からカスタムUIViewを作成する時は、initWithFrameを用い、カスタムクラスの方にもそれを実装する。
NSDictionaryとかNSArrayを編集したくてNSMutableDictionaryにする時、mutableCopyメソッドで新しいインスタンスを得るわけだけど、これはあくまでcopyなのでautoreleaseされてない。
プロパティに代入する時にはautoreleaseすると良い。
気がついたら追加していきます。
それは違うよってご指摘大歓迎です。
【送料無料】Objective-Cプログラマーズバイブル |