IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> OC中的内存管理 -> 正文阅读

[移动开发]OC中的内存管理

?

看官们,我们在前面章回中介绍了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,不要混淆它们;

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

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:56:35  更:2021-12-13 12:57:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:01:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码