[iPhone]allocしてない変数はreleaseに注意

あるクラスでインスタンス変数でNSArrayを定義して、そのクラスインスタンスからNSArrayの変数にアクセスしようとするとKILLされるということがあった。
何がだめかといったら、allocしてないのに、releaseしてしまったということ。

以下、ダメだったコード。
UIViewを継承したHogeクラス

@synthesize hogeArray;
-(id)initWithFrame:(CGRect) frame {
    if ((self = [super initWithFrame:frame])) {
    }
    NSMutableArray* array = [NSMutableArray array];//←allocしてないから保持カウント増えてない
    [array addObject:@"hoge"];
   self.hogeArray = array;
    [array release];//←これがダメ
}

Hogeクラスを呼ぶUIViewを継承したFooクラス。

@synthesize hogehoge;
-(void)awakeFromNib{
   Hoge* hoge = [[Hoge alloc] initWithFrame:CGRectMake(0,0,10,10)];
   self.hogehoge = hoge;
    [hoge release];
    NSLog(@"hoge.arary : %@",hoge.hogeArray);//ここでは参照できる
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     NSLog(@"hoge.arary : %@",hoge.hogeArray);//ここでは参照できない
}

書籍のサンプルコードを眺めていた感じは、ローカル変数を作ってから、インスタンス変数に代入という流れが多かった。
ローカル変数をallocして初期化したときは、すぐにreleaseしてあげる流れだけど、allocしないで初期化するような場合は注意が必要なのね。

[iPhone]InterFaceBuilderに設定してあるオブジェクトの初期化にはinitWithCoderもしくは、awakeFromNib

(IBを使って)nibファイルにオブジェクトを引き充てた場合、nibからオブジェクトインスタンスが読み込まれる時、initもinitWithFrameも呼び出されない。
初期化処理的なコードを記載したいときは、initWithCoderを使う。
とのこと。

もうひとつnibから読み込まれたときに実行されるメソッドでawakeFromNibというメソッドがある。
nibファイルを読み込んでメモリ上にインスタンスが復元された後に呼びだされる、とのこと。
(initWithCoderはそうじゃないないのか??)
こちらはIBのGUIで設定したパラメータを取得したときに使う。
らしい。

イマイチ使い分けがわからんのだけど、定義は

-(void) awakeFromNib;
-(id)initWithCoder:(NSCoder*)coder;

なので、initWithCoderは引数があって、戻り値を返すような仕様。
(selfを戻すらしい)
根本的にどういうものなのかはまだよくわからん。。

ちなみに実行される順番としては、
initWithCoder→awakeFromNib
って感じでこれは予想通り。

[Event]オブジェクト指向で考えるAS3勉強会をやりました

都内某所でワークショップやりました。

Flash初心者向けの内容で、
「Flashでのオブジェクト指向的な考え方とはなんぞや?」
という部分に的を絞って2時間ひたすらしゃべって喋りました。
自分的にはこの部分を理解するまでにかなりの時間を費やしたので、これで理解を早めるきっかけになれればいいなという思いでスライドを作りました。

本日のスライド
オブジェクト指向で考えるAS3
サンプルファイル
sample.zip

講義後のアンケートをみたかんじでは参加者12名の反応はまずまず。
まったくわからなかったという人が居なかったので一安心。
10人中、1人でも「そうだったのか」とおもってくれれば良いと思っていたけど、半分くらいの人が理解が深まったと書いてくれたのでやったかいがありました。
よかったよかった。