NSArray / NSMutableArray のメモリ管理

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

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

  • 初期化 : initXXXXのメソッドで指定されたオブジェクトは全てretainされる. arrayXXXはautorelease.
  • 追加 : 追加されるオブジェクトがretainされる.
  • 削除 : 追加されるオブジェクトがreleaseされる.
  • 配列自体がdealloc : 内包しているオブジェクト全てがreleaseされる.

検証コード

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


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