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