详谈Objective-C内存管理机制

移动开发 iOS
在 Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。

Objective-C内存管理机制是本文要介绍的内容,最近iphone平台比较火,大家都一窝蜂的上了。不过貌似好多都是从Java转过来的程序员,用惯了Java的,对Objective-C可能会不大适应,特别是Objective-C内存管理机制。

手机平台不同于计算机,虽然开发的应用都是小巧的应用,但是由于手机硬件上的局限性,如 果不对内存好好管理的话,还是会出很多问题的,特别是习惯了垃圾回收机制的Java程序员,最容易忽视这个问题。希望下面这篇文章能对大家有所帮助。

Objective-C使用了一种叫做持有计数(Retain Count)的机制来管理内存中的对象。

在 Objective-C中每个对象都对应着他们自己的持有计数(Retain Count),持有计数可以理解为一个整数计数器,当使用alloc方法创建对象的时候,持有计数会自动设置为1。当你向一个对象发送retain消息 时,持有计数数值会增加。相反,当你像一个对象发送release消息时,持有计数数值会减小。当对象的持有计数变为0的时候,对象会释放自己所占用的内 存。

为什么要使用持有计数这个概念呢?

想象一下,有时候你会在多个不同对象中引用同一个对象。当你在一个地方 释放这个公用对象 时,势必会对其他引用这个公用对象的对象产生影响。但是如果每当你引用这个公用对象时,都向持有计数发送一个retain消息,释放一个对象时,发送一个 release消息。这样对象的持有计数会记录到底有多少个对象引用了它自己。当它的持有计数变为0的时候,这意味着没有其他对象引用这个对象了,那么它 可以安全的释放自己所占用的内存。

对上面情况的一个比较形象的比喻,假设我们有一条狗和几个用绳子牵着这条狗的人,那么不到***一个人松掉手中的绳子,这只狗是不能获得自由的。而持有计数的作用就是记录了到底有多少个人牵着绳子。

不 同于Java的垃圾回收,Objective-C提供了持有计数这种特别机制。它给予了开发者们更多的控制权,去控制什么时候和怎么样来释放一个对象,但 是这同时需要开发者们更加的细心。如果你过早的释放了一个对象,那么你的应用程序很可能会意外宕掉。相反,如果你很长时间不释放对象占用的内存,那么应用 程序在运行了一段时间后很可能会造成内存泄漏。

数组(Array)是一个比较特别的例子,当你往数组里面添加一个对象时。数组里面存储的并不是这个对象的拷贝,而只是一个指向该对象的指针。数组在保存 这个指针的同时会向指针所指的对象发送一个retain消息,相应的,对象的持有计数会增加。将对象从数组中移除的时候,同样会向对象发送release 消息,对象的持有计数会减小。当我们释放这个数组时,会向保存在这个数组中的所有对象发送release消息。看下面的两个例子:

1、没有释放内存的版本

  1. array = [[NSMutableArray alloc] init];  
  2. for ( i = 0; i < 10; i++) {  
  3. newNumber = [[NSNumber alloc]initWithInt:(i * 3)];  
  4. [array addObject:newNumber];  

上 面的代码在创建newNumber对象时,向对象的发送了retain消息,对象的持有计数变为1。当向array中添加这个对象的引用时,又向对象发送 了一次retain消息,这样对象的持有计数就变为2了,在使用完array时,我们会习惯性的释放掉array,但这样并不会释放array所持有的对 象,而只是使所有对象的持有计数变为1,这些对象依然会占用着内存。

2、释放内存的版本

  1. for (i = 0; i < 10; i++) {  
  2. newNumber = [[NSNumber alloc]initWithInt:(i*3)];  
  3. [array addObject:newNumber];  
  4. [newNumber release];  

小结:关于详谈Objective-C内存管理机制的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: cocoachina
相关推荐

2011-05-11 15:45:50

内存管理Objective-C

2011-07-20 17:04:43

Objective-C 内存 内存泄露

2011-07-21 09:32:07

Objective-C 内存 Autoreleas

2011-07-21 10:10:42

Objective-C 内存 Autoreleas

2011-07-18 17:14:16

Objective-C 内存 Cocoa

2011-08-16 17:43:47

Objective-C内存管理Autorelease

2011-08-01 11:37:41

iPhone Objective- 内存

2011-07-29 16:08:31

Objective-C 内存

2011-07-19 15:15:09

Objective-C 内存

2011-07-21 09:42:27

Objective-C 内存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS内存管理系统自动创建新的aut

2013-04-11 14:32:00

Objective-CiOS开发内存管理@synthesize

2013-09-29 15:11:46

Linux运维内存管理

2010-07-23 09:34:48

Python

2010-09-26 13:23:13

JVM内存管理机制

2022-06-01 16:01:58

MySQL内存管理系统

2011-08-04 18:14:42

Objective-C 消息

2010-12-10 15:40:58

JVM内存管理

2011-06-29 17:20:20

Qt 内存 QOBJECT

2020-11-08 14:32:01

JavaScript变量内存管理
点赞
收藏

51CTO技术栈公众号