直接拿xcode 实践对比打印出来retaincount 来看看引用计数到底怎样增加和减少的
首先在Xcode里面setting设置打开ARC ,并且设置为NO,打开方式直接搜索automatic 即可
我们知道 oc 的内存管理的黄金法则就是 凡是alloc copy retain MutableCopy 等等修饰的变量都会引用导致引用计数+1,直接贴代码
打印结果是
简单说明:我们alloc 数组arr1时 ,arr1引用计数为1 然后[arr1 retain]一次 此时引用计数为2
接着 直接用一个新的指针arr2 指向arr1的内存,此时我们可以看作两个指针其实是指向同一片内存,那么打印出的arr1 的引用计数 和arr2 的引用计数是一样的(我个人这样理解,可能理解不到位,欢迎批评指正)。此时对arr2 进行retain操作,引用计数 +1 ,打印出来看到 arr1 和arr2 都为3 ,证明确实arr1 和arr2 指针指向的都是一样的内存对象。这个内存对象的引用计数经过arr1 和arr2 各retain 一次 ,所以变成3.
随后我又用arr3 重新申请一片内存,并初始化赋值arr1,此时 打印arr3 的retaincount ,我们可以看到是1 ,那么可以推测其实arr3指针指向的 新的独立的一块内存空间,引用计数和arr1无关,arr1的内存空间 也没有新的指针指向它,所以arr1和arr2 都是保持3 不变。
接着对arr3 retain 操作,arr3 引用计数变为2,arr1 和arr2 不变。
上面是针对可变容器内对象。
不可变容器内对象我也尝试打印了一下发现如下结果:
不可变对象用[[NSArray alloc]init] 初始化之后变成这鬼东西18446744073709551615。
我还没弄明白怎么回事,求知道的大神指点,
后来我把不可变数组换成 [[NSArray alloc]initWithArray:@[@"1"]]] 这样的初始化时候 一切打印结果和可变的一模一样。
网友评论