当前位置:主页   - 电脑 - 程序设计 - C/C++
Objective C内存管理进阶(一):实践准则
来源:网络   作者:黄锦   更新时间:2011-05-08
收藏此页】    【字号    】    【打印】    【关闭

  这个系列打算写一些我对Iphone开发内存管理的理解。是建立在读者对Objective C的内存管理已经有一定理解的基础上,内容将包括实践准则,autorelease原理剖析,内存泄露的调试等。

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

heisenObject = [array objectAtIndex:n];
 
[array removeObjectAtIndex:n];
 
// 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内存管理进阶(一):实践准则

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明