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
結果、予想通りの動きでした.