被人问到了关于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 \n 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 \n 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 \n 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 \n 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操作会真正执行复制操作,引用计数不变。