iPhone内存管理面面观 对象所有权与引用计数

移动开发 iOS
本文将详细介绍iOS内存管理的对象的所有权与引用计数。希望这些介绍会对开发者有所帮助。

51CTO在前段日子采访了国内最牛的iPhone开发团队,与各位一起走进了iOS开发。在iOS开发里,内存管理是iPhone或iPad开发中最为重要的一部分。掌握好了内存管理,开发出的应用就能运行流畅;掌握不好,开发出的东西就会效率低下,且容易崩溃。本文详细介绍iOS内存管理的对象的所有权与引用计数。希望这些介绍会对开发者有所帮助。

当一个所有者(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放弃该对象时,对象不被销毁。

原文地址:http://lichen1985.com/blog/?cat=10

 

【编辑推荐】

  1. 苹果发布iOS 4大量SDK 全面支持iPhone 4
  2. 专访最牛iPhone开发团队:走进移动开发
  3. 苹果增加iPhone软件销售窗口 旨在示好开发者
  4. iPad软件设计初步:它不只是大号的iPhone
  5. 月入40万 iPhone中文应用程序开发者访谈
责任编辑:佚名 来源: 雨雪霏霏博客
相关推荐

2010-09-13 08:58:47

自动释放便捷方法内存管理

2020-04-08 09:57:53

漏洞安全漏洞漏洞管理

2013-03-25 13:52:39

SDN软件定义网络Hybird

2019-09-11 17:16:34

DockerGitHubWindows

2009-12-30 15:10:44

摩卡

2009-02-16 09:47:00

IPTV技术多媒体运营

2023-03-24 07:31:58

Oracle兼容性产品

2009-07-14 10:56:21

MyEclipse快捷插件

2013-07-22 17:49:52

Ubuntu虚拟机

2011-05-30 17:31:26

自动化测试

2009-07-21 13:01:07

ASP.NET上传文件

2023-06-06 07:31:33

数据库运维管理平台

2011-01-07 09:19:35

Linux文件权限

2010-09-01 17:13:56

无线局域网WLAN

2009-10-28 11:35:25

Linux服务器优化

2020-05-31 18:08:15

Python数据技术

2010-07-08 10:03:39

动态语言PythonRuby

2022-02-22 06:11:46

数字化转型企业云数据库

2015-07-22 09:54:48

互联网+发达国家

2010-01-13 10:34:23

VB.NET局部静态变
点赞
收藏

51CTO技术栈公众号