oc引用计数为-1的情况

来源:互联网 发布:geo数据库教程 编辑:程序博客网 时间:2024/05/29 14:14

以前以为引用计数最小就是1,再小对象就被销毁了,今天练习过程中发现打印出来-1的情况,特此记录,结果可能根据sdk版本不一样,毕竟我的结果就跟视频教程是不一样的,人家的就不是-1,是一创建就是2。贴下代码

NSArray* array1 = [NSArrayarrayWithObjects:nil];

        NSLog(@"array1.retaincount = %ld",array1.retainCount);//打印-1

        NSArray* array2 = [[NSArrayalloc] init];

        NSLog(@"array2.retaincount = %ld",array2.retainCount);//打印-1

        NSArray* array3 = [NSArrayarray];

        NSLog(@"array3.retaincount = %ld",array3.retainCount);//打印-1

        NSArray* array4 = [NSArrayarrayWithObjects:@"hello",nil];

        NSLog(@"array4.retaincount = %ld",array4.retainCount);//打印-1

        

        

        NSString* str1 = [NSStringstringWithString:@"str1"];

        NSLog(@"str1.retaincount = %ld", str1.retainCount);//打印-1

        

        NSString* str2 =@"str2";

        NSLog(@"str2.retaincount = %ld", str2.retainCount);//打印-1

        

        NSString* str3 = [NSStringstringWithFormat:@"str3"];

        NSLog(@"str3.retainCount = %ld", str3.retainCount);//打印-1

        

        NSString* str4 = [NSStringstringWithFormat:@"str%d",4];

        NSLog(@"str4.retainCount = %ld", str4.retainCount);//打印-1

        

        NSMutableString* mStr1 = [NSMutableStringstring];

        NSLog(@"mStr1.retainCount = %ld", mStr1.retainCount);//打印1

        

        NSMutableString* mStr2 = [NSMutableStringstringWithString:@"mStr2"];

        NSLog(@"mStr2.retainCount = %ld", mStr2.retainCount);//打印1

        

        NSString* str5 = mStr2.copy ;

        NSLog(@"str5.retainCount = %ld", str5.retainCount);//打印-1


        NSMutableArray* mArray1 = [NSMutableArrayarray];

        NSLog(@"mArray1.retainCount = %ld",mArray1.retainCount);//打印1


结果:

2016-11-03 16:59:15.625762 04 task4[5675:495680] array1.retaincount = -1

2016-11-03 16:59:15.625789 04 task4[5675:495680] array2.retaincount = -1

2016-11-03 16:59:15.625810 04 task4[5675:495680] array3.retaincount = -1

2016-11-03 16:59:15.625845 04 task4[5675:495680] array4.retaincount = 1

2016-11-03 16:59:15.625876 04 task4[5675:495680] str1.retaincount = -1

2016-11-03 16:59:15.625894 04 task4[5675:495680] str2.retaincount = -1

2016-11-03 16:59:15.625976 04 task4[5675:495680] str3.retainCount = -1

2016-11-03 16:59:15.626042 04 task4[5675:495680] str4.retainCount = -1

2016-11-03 16:59:15.626100 04 task4[5675:495680] mStr1.retainCount = 1

2016-11-03 16:59:15.626130 04 task4[5675:495680] mStr2.retainCount = 1

2016-11-03 16:59:15.626157 04 task4[5675:495680] str5.retainCount = -1

2016-11-03 16:59:15.626197 04 task4[5675:495680] mArray1.retainCount = 1



看起来在创建不可变数组为空时,引用计数为-1;

不可变数组不为空时,引用计数为预想的1;

创建不可变字符串时,引用计数为-1,哪怕是拷贝来的,哪怕拷贝源对象计数为1;

创建可变字符串时引用计数为预想的1;

这估计是系统做的优化,当然不是很要紧,不过确实很让人困惑,不知道用意何在,影响到像我这样的初学者。




0 0
原创粉丝点击