iPhone内存管理面面观 自动释放与便捷方法

移动开发 iOS
本文将介绍在iPhone OS系统上开发软件时要注意内存管理,有效控制内存管理需注意“自动释放”(Auto release)与“便捷方法”(convenience method)。

我们在前面介绍过iPhone软件的内存管理如何有效控制“对象所有权与引用计数”,在这篇文章中我们将介绍“自动释放”(Auto release)与“便捷方法”(convenience method)。

51CTO推荐专题:iPhone应用程序开发初探

有时候一个所有者创建一个对象后,会立刻将该对象的指针传递给其它所有者。这时,这个创建者不希望再拥有这个对象,但如果立刻给它发送一个release消息会导致这个对象被立刻释放掉——这样其它所有者还没有来得及保留该对象。解决这个两难问题的方法是,给对象发送一个autorelease消息:这样创建者不再拥有该对象的所有权;该对象成为自动释放的对象,但是不会立刻被释放掉;其它所有者可以有时间保留或复制该对象,并成为其唯一所有者。

我们来看一个自动释放的例子(代码清单3-1)。一个所有者先用alloc方法创建一个对象;此时该所有者拥有这个对象,对象的引用计数为1。紧接着,所有者自动释放该对象;所有者此时已经放弃了所有权,但对象的引用计数在一段时间内依然为1。我们可以看出自动释放的另一个好处:你不会因为在后面忘记给对象发送release消息而造成内存泄露。

代码清单3-1

  1.  
  2.  
  3. -(Object*)returnAutoreleaseObject {  
  4.  
  5. Object* obj = [[Object alloc] init];  
  6.  
  7. return [obj autorelease];  
  8.  
  9. }  

与自动释放相关的,有一大类构造方法(constructor method),由它们构造的对象直接就是自动释放的对象;这一类构造方法叫做便捷方法。比如下面这句的字符串就是一个自动释放的对象,stringWithFormat:就是一个便捷方法。

  1. NSString* string = [NSString stringWithFormat:@”autoreleaseString”]; 

再举几个便捷方法的例子,方便读者以后的开发。

1.NSArray的arrayWithObjects:和arrayWithArray:。

2.UIImage的imageNamed:。

3.NSNumber的numberWithBool等。

现在我们已经解释了,autorelease方法会在一段时间以后释放掉一个对象,在这段时间内我们可以安全地使用该对象。那么这段时间究竟是多久呢?我们需要先更多地了解自动释放的机制,再来回答这个问题。

让我们先来看看自动释放池。自动释放池是NSAutoreleasePool的实例,其中包含了收到autorelease消息的对象。当一个自动释放池自身被销毁(dealloc)时,它会给池中每一个对象发送一个release消息(如果你给一个对象多次发送autorelease消息,那么当自动释放池销毁时,这个对象也会收到同样数目的release消息)。可以看出,一个自动释放的对象,它至少能够存活到自动释放池销毁的时候。

那么自动释放池何时被创建,又何时被销毁呢?在每一个事件周期(event cycle)的开始,系统会自动创建一个自动释放池;在每一个事件周期的结尾,系统会自动销毁这个自动释放池。一般情况下,你可以理解为:当你的代码在持续运行时,自动释放池是不会被销毁的,这段时间内你也可以安全地使用自动释放的对象;当你的代码运行告一段落,开始等待用户输入(或者其它事件)时,自动释放池就会被释放掉,池中的对象都会收到一个release消息,有的可能会因此被销毁。

到此为止,相信你已经对自动释放的机制有了一个大体的了解。自动释放而非直接释放,可以帮助你节省一些代码量,提高开发速度。但是它有一个直接的缺点:它延缓了对象的释放,在有大量自动释放的对象时,会占用大量内存资源。因此,你需要避免将大量对象自动释放。并且,在以下两种情况下,你需要手动建立并手动销毁掉自动释放池:

1.当你在主线程外开启其它线程时:系统只会在主线程中自动生成并销毁掉自动释放池。

2.当你在短时间内制造了大量自动释放对象时:及时地销毁有助于有效利用iPad上有限地内存资源。

【编辑推荐】

  1. iPhone内存管理面面观 对象所有权与引用计数
  2. iPhone开发入门守则:Objective-C编码规范
  3. iPhone开发入门篇 “Hello World”分析代码
  4. iPad软件设计初步:它不只是大号的iPhone
责任编辑:佚名 来源: 雨雪霏霏博客
相关推荐

2010-08-19 09:24:41

iPhone

2020-04-08 09:57:53

漏洞安全漏洞漏洞管理

2011-05-30 17:31:26

自动化测试

2013-03-25 13:52:39

SDN软件定义网络Hybird

2019-09-11 17:16:34

DockerGitHubWindows

2009-12-30 15:10:44

摩卡

2009-07-14 10:56:21

MyEclipse快捷插件

2009-02-16 09:47:00

IPTV技术多媒体运营

2023-03-24 07:31:58

Oracle兼容性产品

2013-07-22 17:49:52

Ubuntu虚拟机

2009-07-21 13:01:07

ASP.NET上传文件

2010-09-01 17:13:56

无线局域网WLAN

2023-06-06 07:31:33

数据库运维管理平台

2009-10-28 11:35:25

Linux服务器优化

2022-02-22 06:11:46

数字化转型企业云数据库

2010-07-08 10:03:39

动态语言PythonRuby

2015-07-22 09:54:48

互联网+发达国家

2010-01-13 10:34:23

VB.NET局部静态变

2010-11-23 09:29:49

Lync微软

2011-07-22 10:58:44

Linux社区Ubuntu
点赞
收藏

51CTO技术栈公众号