原文地址:【转】iOS内存管理系列之一:对象所有权与引用计数作者:anynot

内存管理是iPhone或iPad开发中最为重要的一部分。掌握好了内存管理,开发出的应用就能运行流畅;掌握不好,开发出的东西就会效率低下,且容易崩溃。从本文开始,我将分几次详细介绍iOS内存管理的方方面面,包括对象的所有权与引用计数、自动释放与便捷方法、访问器方法与属性、一些会改变引用计数的特殊情况、以及一个总结。希望这些介绍会对开发者有所帮助。

本系列文章版权归李晨所有,出版权归华章公司所有,谢绝转载。

-----对象所有权(ownership)与引用计数(retain count、reference count)-----

当一个所有者(owner,其本身可以是任何一个Objective-C对象)做了以下某个动作时,它拥有对一个对象的所有权(ownership):

1. 创建一个对象。包括使用任何名称中包含“alloc”、“new”、或者“copy”的方法。

2. 保留(retain)一个对象。

一个对象可以有多个所有者,一个所有者也可以拥有多个对象。

相应的,引用计数增减的基本规则是:

1.当所有者创建一个对象时,该对象的引用计数为1。

2.当所有者保留它时,该对象的引用计数加1。

3.当所有者释放(release)它时,该对象的引用计数减1。

与此相关的,当一个所有者对于一个对象的引用计数的增减总计为0时,它放弃了对这个对象的所有权。

现在我们可以从两个不同的角度来看Objective-C的内存管理问题。从对象所有权的角度来看,当一个对象有着至少一个所有者(owner)的时候,它依然存在;当它没有任何所有者的时候,它会被释放掉。从引用计数的角度看,一个对象存在时,其引用计数大于零;当一个对象的引用计数为零时,它会调用dealloc方法并释放掉。这两个角度的关系是:在所有权的背后起作用的机制是引用计数机制;我们通过引用计数的增减来理解所有权的概念;但是你只应当使用所有权的概念来管理内存,因为如果你试图直接获取对象的引用计数,那么得到的数将让你感到匪夷所思----系统的一些框架会“偷偷”增减对象的引用计数。

回顾一下,内存管理的目标是:当一个对象的某个所有者依然需要使用它时,保证这个对象的存在;当一个对象的所有所有者都不再需要它时,保证这个对象被销毁。因此只要任何一个所有者在使用完一个对象之后释放掉它,那么以上内存管理的目标就可以实现。我们可以得出任何一个所有者(记住,所有者本身也只是一个对象)所应当遵守的基本步骤:

拥有一个对象-> 使用一个对象 -> 放弃对象的所有权。

从引用计数的角度来看就是:

还需要这个对象时,保持对其增减为正;不再需要这个对象时,保持对其增减为0。

下图很好地诠释了这些基本规则:所有者1和所有者2单独地执行了拥有对象、使用对象、放弃对象所有权的步骤;当所有者1不再需要该对象时及时放弃了所有权,但此时所有者2依然拥有该对象,因此该对象依然存在,所有者2可以继续使用它;当所有者2也不再需要该对象时,也放弃掉所有权,这时对象以不再有任何所有者(相应的引用计数也变为0),因此立刻被销毁掉。

需要注意的是,所有者2只是复制了该对象的指针,并没有使用copy方法,因此复制指针这个操作本身并不增加对象的引用计数;而正因为所有者2希望能使用该对象,因此通过retain方法成为它的所有者,也保证了所有者1放弃该对象时,对象不被销毁。

转载于:https://www.cnblogs.com/lijinfu-software/p/10370834.html

iOS内存管理系列之一:对象所有权与引用计数相关推荐

  1. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...

  2. iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现

    关于阅读<Object-C高级编程-iOS与OS X多线程和内存管理>一书后的iOS内存管理系列思考 <关于iOS内存管理的规则思考> <iOS内存管理--alloc/r ...

  3. iOS内存管理策略和实践

    来源:http://www.baidu.com/link?url=irojqCBbZKsY7b0L2EBPkuEkfJ9MQvUf8kuNWQUXkBLk5b22Jl5rjozKaJS3n78jCnS ...

  4. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  5. 【iOS开发】—— iOS内存管理

    文章目录 1. iOS内存分配区域 1.1 栈区 1.2 堆区 1.3 常量区 1.4 全局区/静态区 1.4.1 static静态变量 1.4.2 extern全局变量 1.5 代码区 2. iOS ...

  6. iOS 内存管理机制与原理

    内存分区 内存一般分为五大区:栈区.堆区.常量区.全局区.代码区.如图 1.栈区 是由编译器自动分配并释放的,主要用来存储局部变量.函数的参数等,是一块连续的内存区域,遵循先进后出(FILO)原则.一 ...

  7. OC 知识:彻底理解 iOS 内存管理(MRC、ARC)

    1. 什么是内存管理 程序在运行的过程中通常通过以下行为,来增加程序的的内存占用 创建一个OC对象 定义一个变量 调用一个函数或者方法 而一个移动设备的内存是有限的,每个软件所能占用的内存也是有限的 ...

  8. iOS内存管理(ARC,MRC)

    iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...

  9. ios 内存管理的理解(一) 简述

    1. 内存管理的范围 所有的OC对象(继承自NSObject类) 本质原因:是因为对象和其他数据类型在系统中的存储空间不一样,其他局部变量主要存放于栈中,而对象存储于堆中. 当代码块结束时,这个代码块 ...

最新文章

  1. vc++图像保存,重绘
  2. mysql_5.6.21_安装使用说明
  3. 58. Length of Last Word
  4. 直播变局下百度移动生态新“野望”
  5. 674 Longest Continuous Increasing Subsequence(每日一题)
  6. jq之mousedown
  7. php switch if,php switch 与 if else 区别
  8. 代码分析 | 单细胞转录组clustering详解
  9. 浅谈软件开发过程及项目管理
  10. Java配置文件Properties的读取、写入与更新操作
  11. UIScrollerView ,UIPageControl混搭使用,添加定时器,无限循环滚动
  12. linux系统怎样安装驱动程序,linux下如何安装硬件驱动程序?linux系统如何加载USB光驱...
  13. mysql 中文脱敏_怎样选择数据库脱敏系统?
  14. 抖音运营攻略大全,新手主播必知干货丨国仁网络
  15. pdm系统是归档服务器吗,PDM系统的主要功能
  16. 基于STM32设计的云端健康管理系统(采用阿里云物联网平台)
  17. 云原生时代的 Java 虚拟机
  18. 基于OpenCV的二维码和条形码识别
  19. 【微信小程序】—— wx.showToast 延迟页面跳转、一闪而过 问题解决办法
  20. BIGEMAP如何导出含高程值的标注点(线路高程提取)

热门文章

  1. java时间类Date、Calendar及用法
  2. mybatis+Druid连接池的问题
  3. monkey测试小结
  4. [转]Boosting
  5. 修改Linux SSH连接端口和禁用IP,安装DDoS deflate
  6. 3 django系列之Form表单在前端web界面渲染与入库保存
  7. AngularJS日期格式化
  8. Integer类的装箱和拆箱到底是怎样实现的?
  9. 【转】win7 32位安装oracle10g步骤
  10. javascript单元测试:jasminejs 2.0的烦恼