ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

OC中的内存管理

2021-12-12 20:02:02  阅读:187  来源: 互联网

标签:管理 对象 OC autorelease 计数 ARC 引用 内存


 

看官们,我们在前面章回中介绍了OC中的KVO,本章回中将介绍OC中的内存管理。


内存管理涉及到了指针,内存分配和释放以及内存布局中的栈与堆,代码区等,这些内容与C语言相同,我们不做详细介绍。如果有看官不了解这些知识可以参考我在C语言专栏中写过的关于内存布局的博客。我们在本章回中主要介绍引用计数相关的内容。

引用计数原理

在OC中每个对象都有一个整数与它关联,当有一个指针指向对象时,该整数的值加1,当指针不再指向对象时该整数值减1;当该整数值为0时系统会调用dealloc方法回收对象占用的内存,以免造成内存泄漏。这个整数叫作引用计数器,使用它管理对象使用内存的过程叫引用计数原理。其实这和C++中的引用计数原理相同,如果大家有C++基础的话很容易理解此过程。

 强引用与弱引用

在引用计数原理中可以引起引用计数器变化的对象(通常是指针)就是强引用,反之就是弱引用。弱引用会随着对象的生命周期结束而结束。OC中引入弱引用主要是为了解决强引用循环导致内存泄漏的问题。我们可以通过strong和weak来指定对象是强引用还是弱引用,如何指定呢?我们在后面章回中介绍。

手动引用计数

在OC早期时,对象的引用计数是手动处理的,使用retain方法可以给对象的引用计数器加1,使用release方法可以给对象的引用计数器减1。写程序的时候手动管理对象的引用计数非常麻烦,而且还容易出错,因此苹果在iOS4之后引用了自动引用计数来解决此问题。此外,使用XCode开发应用程序时,它默认打开了自动引用计数的功能,当然也可以在设置中手动关闭自动引用计数功能,不过不建议这样做。XCode在4.2版本之后引入自动计数,低于此版本的不支持该功能,不过估计大家都不使用这么低版本的XCode了。关于手动引用计数,大家只需要了解一下手动引用计数的基本概念就可以了,毕竟现在写程序时已经不需要手动引用计数了。

自动引用计数

刚才提到的自动引用计数也叫ARC,它是Automatic Reference Counting的缩写,它通过CLang编辑器自动管理对象的引用计数器,并且会自动释放对象占用的内存。我们现在写程序时只需要说明对象是强引用还是弱引用就可以,编译器会自动管理引用计数。我们在写程序时容易混淆ARC和autorelease块,认为二者是相同的东西,其实它们不一样。autorelease块的语法如下:

  @autoreleasepool {
       //add your code
  }

我们如果想在ARC回收内存前释放掉某些对象的内存,那么可以把这些对象放到autorelease块中,当autorelease块结束时就会自动释放这些对象占用的内存,这种场景类似于Java中的匿名对象,使用完后很快就可以释放内存。我们在编写程序时可以依据程序的内容适当使用autorelease块。说了这么多二者到底有什么区别呢?autorelease块可以看作是ARC的一部分,它会让ARC提前释放部分对象的内存,但是它不能代表ARC。

最后我们对本章回的内容做一个总结:

  •  1.OC中使用引用计数来管理对象的内存;
  •  2.明白引用计数的原理和手动引用计数的基本概念;
  •  3.在iOS编程中使用ARC来管理对象的内存,XCode自动打开了此功能;
  •  4.在某些场合下适当使用autorelease块可以提高ARC的内存管理效率;
  •  5.autorelease块只是ARC的一部分,它不能全部代表ARC,不要混淆它们;

看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解!

标签:管理,对象,OC,autorelease,计数,ARC,引用,内存
来源: https://blog.csdn.net/talk_8/article/details/121883152

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有