引用计数的一些测试

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值