【iOS夯实】内存管理之引用计数

什么是引用计数

原理

当我们创建一个新对象的时候,它的引用计数为1;当有一个新的指针指向这个对象时,我们将其引用计数加1;当这个指针不再指向这个对象的时候,我们将其引用计数减1;当这个对象的引用计数为0的时候,说明这个对象不再被如何指针指向,这个时候就可以销毁对象,回收内存。

引用计数原理

对应的消息发送方法如下

  1. 当对象被创建(通过 alloc、new 或 copy 等方法)时,其引用计数初始值为1
  2. 给对象发送 retain 消息,其引用计数加1
  3. 给对象发送 release 消息,其引用计数减1
  4. 当对象引用计数归0时,Objective-C 給对象发送 dealloc 消息销毁对象

添加编译参数

新建一个工程,由于现在的工程默认开启自动引用计数(Automatic Reference Count),我们需要修改工程设置,启动手工管理引用计数的模式。
在 Target 的 Build Phases 中给 AppDelegate.m 加上 -fno-objc-arc 的编译参数。


添加代码

在 AppDelegate.m 中添加以下代码,通过 Log 可以看到引用计数的变化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSObject *object = [[NSObject alloc] init];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
NSObject *anotherObject = [object retain];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
[anotherObject release];
NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);
[object release];

return YES;

}

运行结果如下图


不要向已释放的对象发送消息

在上面的代码中的 object 对象释放后添加以下代码

NSLog(@"Reference Count = %lu", (unsigned long)[object retainCount]);

运行后得到结果会发现获取到的引用计数为1,为什么不是0呢?

因为对引用计数为1的对象 release 时,系统知道该对象即将被回收,就不会再对该对象的引用计数进行减1操作,这样可以增加对象回收的效率,加速对象的回收。

对已释放的对象发送消息是不可取的,因为对象的内存已被回收,如果发送消息时,该内存已经被其他对象使用了,得到的结果是无法确定的,有可能造成程序异常崩溃。

最后

本人为iOS开发新手一枚,写的不好的或写错的地方,希望各位大侠能帮忙指正。
各位大侠,如果觉得对自己有点用的,欢迎点个赞,也欢迎大家关注我( Github / 简书 / 微博 / Instagram / 知乎)
谢谢观看此文。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 5,246评论 1 17
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,532评论 1 3
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,363评论 0 6
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,007评论 0 7
  • 内存管理的基本范围和概念. 程序运行过程中药创建大量的对象, 和其他高级语言类似,在ObjC中对象存储在堆区,程序...
    ValienZh阅读 904评论 0 2