参照カウントのいくつかのテスト

3937 ワード

copyと参照カウントについて質問されました.久しぶりだったので、推測を検証するためにテストをしました.
テストコード:
 
    NSLog(@" ===copy ");
   
    NSMutableArray *mutableArray1 = [[NSMutableArray alloc]init];
    [mutableArray1 addObject:@"sun"];
 
    NSLog(@"mutableArray1.retainCount == %ld",mutableArray1.retainCount);
    
    NSArray *mutableArray2=[mutableArray1 copy];

    NSLog(@"mutableArray1.retainCount == %ld",mutableArray1.retainCount);
    NSLog(@"mutableArray2.retainCount == %ld",mutableArray2.retainCount);
    NSLog(@"mutableArray1: %p 
mutableArray1:%p",mutableArray1,mutableArray2); NSLog(@" ===copy "); NSArray *array1=[[NSArray alloc]initWithObjects:@"sun", nil]; NSLog(@"array1.retainCount == %ld",array1.retainCount); NSArray *array2=[array1 copy]; NSLog(@"array1.retainCount == %ld",array1.retainCount); NSLog(@"array2.retainCount == %ld",array2.retainCount); NSLog(@"array1: %p
array1:%p",array1,array2);

しゅつりょく
2014-11-25 17:35:45.617 test [7141:128919] ======= 
2014-11-25 17:35:45.617 test [7141:128919] mutableArray1.retainCount == 1
2014-11-25 17:35:45.617 test [7141:128919] mutableArray1.retainCount == 1
2014-11-25 17:35:45.617 test [7141:128919] mutableArray2.retainCount == 1
2014-11-25 17:35:45.618 test [7141:128919] mutableArray1: 0x7ff58974dc60  mutableArray1:0x7ff58974db40

2014-11-25 17:35:45.618 test [7141:128919] ======= 
2014-11-25 17:35:45.618 test [7141:128919] array1.retainCount == 1
2014-11-25 17:35:45.618 test [7141:128919] array1.retainCount == 2
2014-11-25 17:35:45.618 test [7141:128919] array2.retainCount == 2
2014-11-25 17:35:45.618 test [7141:128919] array1: 0x7ff58974db60  array1:0x7ff58974db60


以上のテストコードによると、可変配列に対してcopy操作を実行すると、真のコピー操作が実行され、参照カウントは変わらない.可変数のcopy操作は、コピー操作を実際に実行するのではなく、カウント+1を参照します.
テストコード:
    NSLog(@" ===mutableCopy");
    
    NSMutableArray *mutableArray1 = [[NSMutableArray alloc]init];
    [mutableArray1 addObject:@"sun"];
    
    NSLog(@"mutableArray1.retainCount == %ld",mutableArray1.retainCount);
    
    NSArray *mutableArray2=[mutableArray1 mutableCopy];
    
    NSLog(@"mutableArray1.retainCount == %ld",mutableArray1.retainCount);
    NSLog(@"mutableArray2.retainCount == %ld",mutableArray2.retainCount);
    NSLog(@"mutableArray1: %p 
mutableArray1:%p",mutableArray1,mutableArray2); NSLog(@" ===mutableCopy"); NSArray *array1=[[NSArray alloc]initWithObjects:@"sun", nil]; NSLog(@"array1.retainCount == %ld",array1.retainCount); NSArray *array2=[array1 mutableCopy]; NSLog(@"array1.retainCount == %ld",array1.retainCount); NSLog(@"array2.retainCount == %ld",array2.retainCount); NSLog(@"array1: %p
array1:%p",array1,array2);

しゅつりょく
2014-11-25 17:41:17.205 test [7188:131600] ======= 
2014-11-25 17:41:17.206 test [7188:131600] mutableArray1.retainCount == 1
2014-11-25 17:41:17.206 test [7188:131600] mutableArray1.retainCount == 1
2014-11-25 17:41:17.206 test [7188:131600] mutableArray2.retainCount == 1
2014-11-25 17:41:17.206 test [7188:131600] mutableArray1: 0x7fc71bc95650  mutableArray1:0x7fc71bc95680

2014-11-25 17:41:17.206 test [7188:131600] ======= 
2014-11-25 17:41:17.207 test [7188:131600] array1.retainCount == 1
2014-11-25 17:41:17.207 test [7188:131600] array1.retainCount == 1
2014-11-25 17:41:17.207 test [7188:131600] array2.retainCount == 1
2014-11-25 17:41:17.207 test [7188:131600] array1: 0x7fc71bc2b380  array1:0x7fc71bc3e280



以上のテストコードから、
可変配列に対してmutableCopy操作を実行すると、真のコピー操作が実行され、参照カウントは変更されません.可変数値に対してmutableCopy操作を行うと、実際にコピー操作が実行され、参照カウントは変更されません.