小弟新手,对Objective-C中的内存管理机制和方法不是很精通,写个随笔和大家一起分享下,如有问题欢迎各位大大纠正。

闲言少叙,我们马上进入正题(本随笔内容参考<<好学的Objective-C>> 特此感谢原作者)

使用引用计数

每个从NSObject继承的对象都继承了一定的内存管理行为。在这些对象的内部存在一个称为保留计数的计数器。在进行某些调用时,计数器的值可以增加或者减少。

Objective-C语言运行时知道当保留计数为0时,目标对象就可以被释放。在对象释放时,其所有的内存资源都会归还给系统以供重复使用。

保留技术可以通过几种标准的方式增加。最常见的方式是使用名字中包含 alloc 或者 create 的方法创建一个新对象,返回对象的保留计数是1

此外,使用名字中包含 copy 一词的方法获取对象时,返回对象的保留计数也是1。还可以通过调用 retain 方法手动增加保留计数。

最后,可以通过调用 release 方法减少保留计数。再次强调,在保留计数变成0时,对象及其相应的内存都会被释放

---对象分配的标准方式---

Bar *foo = [[Bar alloc] init];

在本例中,执行完该方法后,foo对象的保留计数是1。

---保留对象---

Bar *foo = [[Bar alloc] init];
[foo retain];

在本例中,除了通过调用 alloc 分配一个对象外,还通过 retain 方法增加了保留计数。

执行完该方法后,对象的保留计数是2。

---分配和释放对象---

Bar *foo = [[Bar alloc] init];
[foo release];
[foo dosomething];

在本例中,调用 release 方法后,对象的保留计数变成了0,从而会被释放。其后的代码由于试图访问被释放的对象而导致程序崩溃

---内存泄露---

Bar *foo = [[Bar alloc] init];
[foo retain];
[foo release];

在本段代码中,首先分配了一个对象,然后保留了该对象,之后释放它,但只释放了一次。如果这是一个成员变量,我会再次向它发送 release 消息,从而再次释放对象,这样就没有问题了。

但在本例中,我们只在这个特定的栈中使用该代码,就会导致内存泄露。

---没有保留对象---

@interface Foo : NSObject
{
      memberVariable
}
@end

@implementation Foo

-(void)someMethod;
{
      memberVariable = [someOtherObject getFoo];
}

在本例中,所讨论的代码应该保留通过方法名中不带 alloc copy 或者 create 的调用获得的对象。在程序退出了该方法后,目标对象就会被程序运行时释放掉。

下次访问该对象时就会导致崩溃。由于此处的变量是作为成员变量使用的,所以应该保留。

说明

从技术上说,对象如果之前没有被保留,那么在下一个运行循环后会被释放。不过从循环内存管理规则的角度考虑,你可以假定对象出了作用域后,只要没有被保留,就会被释放。

 

PS:这就是Objective-C中引用计数的概念,下节内容我会分章节介绍具体内容(内存管理规则,使用自动释放,对象内部内存等)。

 

 

posted on 2012-08-02 13:46  小苹果一枚  阅读(156)  评论(0编辑  收藏  举报