ObjectiveC内存管理之实践准则

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

从策划到设计制作,每一步都追求做到细腻,制作可持续发展的企业网站。为客户提供做网站、网站建设、网站策划、网页设计、域名注册雅安服务器托管、网络营销、VI设计、 网站改版、漏洞修补等服务。为客户提供更好的一站式互联网解决方案,以客户的口碑塑造优易品牌,携手广大客户,共同发展进步。

在进行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。

     

标题名称:ObjectiveC内存管理之实践准则
文章位置:http://www.36103.cn/qtweb/news17/2117.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联