[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しないで初期化するような場合は注意が必要なのね。