@property(nonatomic, retain)をしたときのメモリ管理の動き
はじめに
@property(nonatomic, retain) したときのメモリ管理の動きが気になりここに示す。
前提:@property(nonatomic, retain) のセッターの擬似ソース
-(void) setName:(TYPE)obj{ if(name != obj ){ [name release]; name = [obj retain]; } }
参考
- 作者: 荻原剛志
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2011/12/23
- メディア: 単行本
- 購入: 14人 クリック: 98回
- この商品を含むブログ (25件) を見る
つまり、retainを設定した場合は、
何か別のインスタンスを代入したとき、すでに参照しているインスタンスをrelease(参照カウントを-1)している。
arrでアクセスした場合
ヘッダー.h
@property(nonatomic, retain) NSArray *arr;
実装.m
@synthesize arr; - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"arr : %@", arr); //=> null arr = [[NSArray alloc] init]; NSLog(@"arr retainCount : %d", [self.arr retainCount]); //=> 15 }
self.arrでアクセスした場合
実装.m
@synthesize arr; - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"arr : %@", arr); //=> null self.arr = [[NSArray alloc] init]; NSLog(@"arr retainCount : %d", [self.arr retainCount]); //=> 16 }
どういときにself付きでアクセスしたらよいの???
こういうとき
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"arr : %@", arr); //=> null arr = [[NSArray alloc] init]; self.arr = [NSArray array]; NSLog(@"arr retainCount : %d", [self.arr retainCount]); //=> 16 }
すでに誰かがretain済みのものとかautoreleaseされるものを再代入(この表現でよいのか?)したとき。
つまり自分にオーナーシップがないものを代入するとき。
この場合にのみ、既に参照(代入)しているモノに対してreleaseし忘れることなく
新しいインスタンスを代入できる。
ちなみに
arr = [NSArray array]; NSLog(@"arr retainCount : %d", [self.arr retainCount]); //=> 16
の場合も参照カウントは変わっていないが、releaseをし忘れていることになる。