Hatena::ブログ(Diary)

考え得る最高を常に行う このページをアンテナに追加 RSSフィード

2010-10-07

[] NSArray / NSMutableArray のメモリ管理 19:20  NSArray / NSMutableArray のメモリ管理を含むブックマーク  NSArray / NSMutableArray のメモリ管理のブックマークコメント

配列のメモリはちゃんと管理されてるか知りたかったんで確認がてらサンプル作って確かめてみました.

分かったことは以下のルールです.

検証コード

NSObject *objA = [[NSObject alloc] init];

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:objA, nil];
NSLog(@"after init     array; array retainCount:%d expect 1", [array retainCount]);
NSLog(@"after init     array; objA  retainCount:%d expect 2", [objA retainCount]);

NSObject *objB = [[NSObject alloc] init];
NSLog(@"after init      objB; objB  retainCount:%d expect 1", [objB retainCount]);
[array addObject:objB];
NSLog(@"after add       objB; objB  retainCount:%d expect 2", [objB retainCount]);
[array removeObject:objB];
NSLog(@"after remove    objB; objB  retainCount:%d expect 1", [objB retainCount]);

NSObject *objC = [[NSObject alloc] init];
[array addObject:objC];
NSLog(@"after add       objC; objC  retainCount:%d expect 2", [objC retainCount]);

[array release];
NSLog(@"after release  array; objA  retainCount:%d expect 1", [objA retainCount]);
NSLog(@"after release  array; objC  retainCount:%d expect 1", [objC retainCount]);


NSObject *objD = [[NSObject alloc] init];
NSArray *array2 = [[NSArray alloc] initWithObjects:objD, nil];  
NSLog(@"after init    array2; objD  retainCount:%d expect 2", [objD retainCount]);
[array2 release];
NSLog(@"after release array2; objD  retainCount:%d expect 1", [objD retainCount]);

結果

after init     array; array retainCount:1 expect 1
after init     array; objA  retainCount:2 expect 2
after init      objB; objB  retainCount:1 expect 1
after add       objB; objB  retainCount:2 expect 2
after remove    objB; objB  retainCount:1 expect 1
after add       objC; objC  retainCount:2 expect 2
after release  array; objA  retainCount:1 expect 1
after release  array; objC  retainCount:1 expect 1
after init    array2; objD  retainCount:2 expect 2
after release array2; objD  retainCount:1 expect 1

結果、予想通りの動きでした.