Objective C内存管理之实践准则

开发 后端
这是一系列关于Objective C内存管理的文章,主要是面向iPhone开发人员,希望对大家做好苹果手机的移动开发有所帮助。

这个系列打算写一些我对iPhone开发内存管理的理解。是建立在读者对Objective C的内存管理已经有一定理解的基础上,内容将包括实践准则,autorelease原理剖析,内存泄露的调试等。如果您对Objective C内存管理不太了解,建议先读一下Vince Yuan的这个教程。

[[13089]]

在进行iPhone开发时, 内存管理是个相对比较难以理解的东西。Objective-C 使用了一种介于C#和C++之间的内存管理机制。C#是基于Mark-sweep的GC,C++基本上是程序员自己负责分配和释放。Ojbective-C,是程序员来负责Mark(通过Release, retain, alloc)计数, 系统来进行分配和释放。下面是一些准则,可以避免内存泄露和使用已释放的内存造成程序crash。

1)你必须为你自己创建的Object负责。包括alloc, newObject,mutableCopy 等,或者是你调用过retain的object。对于这些Object, 你必须调用release 或autorelease

2)对于其它函数返回的Object,你不能release它,原则上应该由被调用的函数来负责。e.g. NSString str = [NSString stringWithFormat:].  你自己写的函数也最好遵循这个准则,谁申请,谁释放,而不要让调用者来释放。

3)如果你要在某个对象的property里存储另外一个对象,你必须retain或者copy它,避免它被别人release。

@property(retain)。。 这里的retain关键字会自动做这个事情。如果你自己声明set方法就要手动做这个事情。

4)autorelease 意味着该object会由系统在某个时机release它。

5)确保你返回的object是有效的。在如下例子中, 因为heisenObject 被从array中remove掉,会有一个release message到heisenObject,如果没有其它人reference它, heisenObject会被dealloc 掉。

  1. heisenObject = [array objectAtIndex:n];  
  2. [array removeObjectAtIndex:n];  
  3. // heisenObject could now be invalid. 

6) weak reference.   如下图, Document 类中Page property 指向Page类的对象, page类中Parent property指向Document, 这样如果互相之间的retain count都是1的话,那么这两个object永远不会被Dealloc。 解决办法是把page.parent变为weak reference,也就是说, page.parent并不retain Document。  UITableView.datasource, notification observers, delegates, outline view items 等都是week reference。

     

原文标题:Objective C内存管理进阶(一):实践准则

链接:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779755.html

【编辑推荐】

  1. 效仿iPhone 苹果推出全新Mac软件开发服务
  2. Android叫阵iPhone 2010年软件应用数超15万
  3. iPhone应用程序数量预计2010年将达到30万个
  4. 苹果为摆脱谷歌招iPhone地图软件开发者
  5. 月入40万 iPhone中文应用程序开发者访谈
责任编辑:杨鹏飞 来源: 博客园
相关推荐

2011-07-21 10:10:42

Objective-C 内存 Autoreleas

2011-05-11 15:45:50

内存管理Objective-C

2011-07-20 17:04:43

Objective-C 内存 内存泄露

2011-07-18 17:14:16

Objective-C 内存 Cocoa

2010-07-20 08:50:00

autoreleaseObjective C

2011-07-21 09:32:07

Objective-C 内存 Autoreleas

2011-08-18 13:28:35

Objective-C内存

2011-07-29 16:08:31

Objective-C 内存

2011-08-16 17:43:47

Objective-C内存管理Autorelease

2011-08-01 11:37:41

iPhone Objective- 内存

2011-07-21 09:42:27

Objective-C 内存 Autoreleas

2011-07-19 15:15:09

Objective-C 内存

2013-04-11 14:32:00

Objective-CiOS开发内存管理@synthesize

2013-04-11 14:37:36

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

2013-04-11 14:16:57

Objective-CiOS开发内存管理

2011-07-28 18:11:18

Objective-C Cocoa 编程

2015-07-08 10:51:27

Objective-CRuntime

2011-07-22 15:42:39

Objective-C UIView 内存

2013-04-11 13:57:27

Objective-CiOS开发内存管理

2009-12-07 14:53:07

RHEL网络安装
点赞
收藏

51CTO技术栈公众号