【iOS开发】——引用计数的简单了解

在学iOS属性的特性的时候,内存管理方面的“四大天王”让我不得不去了解一下引用计数。

参考文章

IOS引用计数也许并不是你想的那样

iOS开发—内存管理与引用计数

iOS 引用计数

刚开始查阅的时候,发现有博客说:

观点一:引用计数就是有几个指向同一个地址的指针。

观点二:不要把IOS里的引用计数理解成了有几个指针指向对象,引用计数就是几。

先把appDelegate的ARC关闭。
在appDelegate.m上输入以下代码:
请添加图片描述

当创建一个对象时,无论是用[*** new]还是 [[*** alloc ] init];它的引用计数都是1,这个引用计数是存放在所创建对象的头部一个节点内的。从上面代码发现无论有几个指针指向这个对象,这个对象的引用计数始终为一,而且还有一点,就是所有的指针的引用计数和这个对象是一样的,所以这里就要明白一点:引用计数是内存块的属性,并不是指针的,所 以,指向同一块内存的指针的引用计数在同一时刻永远都该是一样的。

接下来在看一组代码:
请添加图片描述

这次我们将 NSObject* ob2 = ob; 改为了 NSObject* ob2 = [ob retain];,为什么结果发生了变化呢?这就得从retain的作用说起了。

retain方法的作用是 ob指针指向的内存块发消息说:喂,老兄,你的引用计数要加1啊,于是,内存块的引用计数就加了1。正因为ob1没有retain的过程,所以不会影响想其引用计数。retain能取得非自己生成并持有的对象,通过retain方法,非自己生成的对象跟用alloc方法生成并持有的对象一样,所以就会使ob的引用计数加1。

这是引用计数加1的情况,那什么情况下会使引用计数减1呢?

废话不多说,上代码。请添加图片描述

因为上面说的引用计数和指针没有关系,所以就打印一个的对象的引用计数就可以了。使用release就可以使这个对象的引用计数减1,直至减为0,当减为0时,存放这个对象的内存快不在存在,也就是系统将在这个内存块上的对象清除了。

所以在开始时我们提出的两个观点中显然观点二是正确的。千万要把IOS里的引用计数理解成了有几个指针指向对象,引用计数就是几。

补充:为什么要release?
防止野指针,所以要及时的将指针置空。

Guess you like

Origin blog.csdn.net/weixin_50990189/article/details/119455019