﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-厚积薄发，滴水穿石-文章分类-Iphone development</title><link>http://www.cppblog.com/cokecoffe/category/17136.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 07 Dec 2011 16:58:45 GMT</lastBuildDate><pubDate>Wed, 07 Dec 2011 16:58:45 GMT</pubDate><ttl>60</ttl><item><title>iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式</title><link>http://www.cppblog.com/cokecoffe/articles/161696.html</link><dc:creator>Wangkeke</dc:creator><author>Wangkeke</author><pubDate>Wed, 07 Dec 2011 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/cokecoffe/articles/161696.html</guid><wfw:comment>http://www.cppblog.com/cokecoffe/comments/161696.html</wfw:comment><comments>http://www.cppblog.com/cokecoffe/articles/161696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cokecoffe/comments/commentRss/161696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cokecoffe/services/trackbacks/161696.html</trackback:ping><description><![CDATA[<p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; "><span style="font-family: 宋体; ">版权声明</span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; "><span style="font-family: 宋体; ">此文版权归作者</span>Vince Yuan (vince.yuan#gmail.com)<span style="font-family: 宋体; ">所有。欢迎非营利性转载，转载时必须包含原始链接</span><a href="http://vinceyuan.cnblogs.com/" target="_blank" style="color: #1d58d1; text-decoration: none; ">http://vinceyuan.cnblogs.com</a><span style="font-family: 宋体; ">，且必须包含此版权声明的完整内容。</span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; "></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; "><span style="font-family: 宋体; ">版本</span>&nbsp;1.1&nbsp;<span style="font-family: 宋体; ">发表于</span>2010-03-08</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "><span style="font-family: 宋体; ">二</span>&nbsp;<span style="font-family: 宋体; ">口诀与范式</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">口诀。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">1.1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">谁创建，谁释放（类似于&#8220;谁污染，谁治理&#8221;）。如果你通过</span>alloc<span style="font-family: 宋体; ">、</span>new<span style="font-family: 宋体; ">或</span>copy<span style="font-family: 宋体; ">来创建一个对象，那么你必须调用</span>release<span style="font-family: 宋体; ">或</span>autorelease<span style="font-family: 宋体; ">。换句话说，不是你创建的，就不用你去释放。</span><br /><span style="font-family: 宋体; ">例如，你在一个函数中</span>alloc<span style="font-family: 宋体; ">生成了一个对象，且这个对象只在这个函数中被使用，那么你必须在这个函数中调用</span>release<span style="font-family: 宋体; ">或</span>autorelease<span style="font-family: 宋体; ">。如果你在一个</span>class<span style="font-family: 宋体; ">的某个方法中</span>alloc<span style="font-family: 宋体; ">一个成员对象，且没有调用</span>autorelease<span style="font-family: 宋体; ">，那么你需要在这个类的</span>dealloc<span style="font-family: 宋体; ">方法中调用</span>release<span style="font-family: 宋体; ">；如果调用了</span>autorelease<span style="font-family: 宋体; ">，那么在</span>dealloc<span style="font-family: 宋体; ">方法中什么都不需要做。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">1.2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">除了</span>alloc<span style="font-family: 宋体; ">、</span>new<span style="font-family: 宋体; ">或</span>copy<span style="font-family: 宋体; ">之外的方法创建的对象都被声明了</span>autorelease<span style="font-family: 宋体; ">。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">1.3<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">谁</span>retain<span style="font-family: 宋体; ">，谁</span>release<span style="font-family: 宋体; ">。只要你调用了</span>retain<span style="font-family: 宋体; ">，无论这个对象是如何生成的，你都要调用</span>release<span style="font-family: 宋体; ">。有时候你的代码中明明没有</span>retain<span style="font-family: 宋体; ">，可是系统会在默认实现中加入</span>retain<span style="font-family: 宋体; ">。不知道为什么苹果公司的文档没有强调这个非常重要的一点，请参考范式</span>2.7<span style="font-family: 宋体; ">和第三章。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">范式。</span><br /><span style="font-family: 宋体; ">范式就是模板，就是依葫芦画瓢。由于不同人有不同的理解和习惯，我总结的范式不一定适合所有人，但我能保证照着这样做不会出问题。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">创建一个对象。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">ClassA *obj1 = [[ClassA alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">创建一个</span>autorelease<span style="font-family: 宋体; ">的对象。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">ClassA *obj1 = [[[ClassA alloc] init] autorelease];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.3<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Release<span style="font-family: 宋体; ">一个对象后，立即把指针清空。（顺便说一句，</span>release<span style="font-family: 宋体; ">一个空指针是合法的，但不会发生任何事情）</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">[obj1 release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">obj1 = nil;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.4<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">指针赋值给另一个指针。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">ClassA *obj2 = obj1;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">[obj2 retain];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">//do something</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">[obj2 release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">obj2 = nil;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.5<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">在一个函数中创建并返回对象，需要把这个对象设置为</span>autorelease</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">ClassA *Func1()</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">&nbsp;&nbsp;ClassA *obj = [[[ClassA alloc]init]autorelease];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">&nbsp;&nbsp;return obj;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">}</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.6<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">在子类的</span>dealloc<span style="font-family: 宋体; ">方法中调用基类的</span>dealloc<span style="font-family: 宋体; ">方法</span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">-(void) dealloc</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">{</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">}</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">在一个</span>class<span style="font-family: 宋体; ">中创建和使用</span>property<span style="font-family: 宋体; ">。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7.1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">声明一个成员变量。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">ClassB *objB;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7.2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">声明</span>property<span style="font-family: 宋体; ">，加上</span>retain<span style="font-family: 宋体; ">参数。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">@property (retain) ClassB* objB;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7.3<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">定义</span>property<span style="font-family: 宋体; ">。（</span>property<span style="font-family: 宋体; ">的默认实现请看第三章）</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.2pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">@synthesize objB;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7.4<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">除了</span>dealloc<span style="font-family: 宋体; ">方法以外，始终用</span>.<span style="font-family: 宋体; ">操作符的方式来调用</span>property<span style="font-family: 宋体; ">。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">self.objB&nbsp;<span style="font-family: 宋体; ">或者</span>objA.objB</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; ">2.7.5<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">在</span>dealloc<span style="font-family: 宋体; ">方法中</span>release<span style="font-family: 宋体; ">这个成员变量。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63.5pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">[objB release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "><span style="font-family: 宋体; ">示例代码如下（详细代码请参考附件中的</span>memman-property.m<span style="font-family: 宋体; ">，你需要特别留意对象是在何时被销毁的。）：</span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@interface ClassA : NSObject</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">{</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassB* objB;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">}</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@property (retain) ClassB* objB;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@end</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@implementation ClassA</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@synthesize objB;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">-(void) dealloc</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">{</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[objB release];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super dealloc];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">}</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">@end</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 70.9pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; text-align: left; ">2.7.6<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">给这个</span>property<span style="font-family: 宋体; ">赋值时，有手动</span>release<span style="font-family: 宋体; ">和</span>autorelease<span style="font-family: 宋体; ">两种方式。</span></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">void funcNoAutorelease()</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">{</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassB *objB1 = [[ClassB alloc]init];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassA *objA = [[ClassA alloc]init];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objA.objB = objB1;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[objB1 release];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[objA release];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">}</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">void funcAutorelease()</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">{</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassB *objB1 = [[[ClassB alloc]init] autorelease];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassA *objA = [[[ClassA alloc]init] autorelease];</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objA.objB = objB1;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ">}</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; text-align: left; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "><span style="font-family: 宋体; ">示例代码文件链接：</span><a href="http://files.cnblogs.com/VinceYuan/objective-c-memman.zip" target="_blank" style="color: #1d58d1; text-decoration: none; ">http://files.cnblogs.com/VinceYuan/objective-c-memman.zip</a></p><img src ="http://www.cppblog.com/cokecoffe/aggbug/161696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cokecoffe/" target="_blank">Wangkeke</a> 2011-12-07 21:48 <a href="http://www.cppblog.com/cokecoffe/articles/161696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iPhone/Mac Objective-C内存管理教程和原理剖析(一)基本原理</title><link>http://www.cppblog.com/cokecoffe/articles/161695.html</link><dc:creator>Wangkeke</dc:creator><author>Wangkeke</author><pubDate>Wed, 07 Dec 2011 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/cokecoffe/articles/161695.html</guid><wfw:comment>http://www.cppblog.com/cokecoffe/comments/161695.html</wfw:comment><comments>http://www.cppblog.com/cokecoffe/articles/161695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cokecoffe/comments/commentRss/161695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cokecoffe/services/trackbacks/161695.html</trackback:ping><description><![CDATA[<div><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">版权声明</span></p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">此文版权归作者</span>Vince Yuan (vince.yuan#gmail.com)<span style="font-family: 宋体; ">所有。欢迎非营利性转载，转载时必须包含原始链接</span><a href="http://vinceyuan.cnblogs.com/" target="_blank" style="color: #1d58d1; text-decoration: none; ">http://vinceyuan.cnblogs.com/</a><span style="font-family: 宋体; ">，且必须包含此版权声明的完整内容。</span></p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "></p><p align="left" style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff; text-align: left; "><span style="font-family: 宋体; ">版本</span>&nbsp;1.1&nbsp;&nbsp;<span style="font-family: 宋体; ">发表于</span>2010-03-08</p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">前言</span></p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">初学</span>objectice-C<span style="font-family: 宋体; ">的朋友都有一个困惑，总觉得对</span>objective-C<span style="font-family: 宋体; ">的内存管理机制琢磨不透，程序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对</span>objective-C<span style="font-family: 宋体; ">内存管理机制的研究成果和经验，写了这么一个由浅入深的教程。希望对大家有所帮助，也欢迎大家一起探讨。</span></p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p align="left" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">此文涉及的内存管理是针对于继承于</span>NSObject<span style="font-family: 宋体; ">的</span>Class<span style="font-family: 宋体; ">。</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">一</span>&nbsp;<span style="font-family: 宋体; ">基本原理</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">Objective-C<span style="font-family: 宋体; ">的内存管理机制与</span>.Net/Java<span style="font-family: 宋体; ">那种全自动的垃圾回收机制是不同的，它本质上还是</span>C<span style="font-family: 宋体; ">语言中的手动管理方式，只不过稍微加了一些自动方法。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">的对象生成于堆之上，生成之后，需要一个指针来指向它。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[ClassA alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">的对象在使用完成之后不会自动销毁，需要执行</span>dealloc<span style="font-family: 宋体; ">来释放空间（销毁），否则内存泄露。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 dealloc];</p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体; ">这带来了一个问题。下面代码中</span>obj2<span style="font-family: 宋体; ">是否需要调用</span>dealloc<span style="font-family: 宋体; ">？</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[ClassA alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj2 = obj1;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 dealloc];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 hello]; //<span style="font-family: 宋体; ">能够执行这一行和下一行吗？</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 dealloc];</p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体; ">不能，因为</span>obj1<span style="font-family: 宋体; ">和</span>obj2<span style="font-family: 宋体; ">只是指针，它们指向同一个对象，</span>[obj1 dealloc]<span style="font-family: 宋体; ">已经销毁这个对象了，不能再调用</span>[obj2 hello]<span style="font-family: 宋体; ">和</span>[obj2 dealloc]<span style="font-family: 宋体; ">。</span>obj2<span style="font-family: 宋体; ">实际上是个无效指针。</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体; ">如何避免无效指针？请看下一条。</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">3<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">采用了引用计数</span>(ref count<span style="font-family: 宋体; ">或者</span>retain count)<span style="font-family: 宋体; ">。对象的内部保存一个数字，表示被引用的次数。例如，某个对象被两个指针所指向（引用）那么它的</span>retain count<span style="font-family: 宋体; ">为</span>2<span style="font-family: 宋体; ">。需要销毁对象的时候，不直接调用</span>dealloc<span style="font-family: 宋体; ">，而是调用</span>release<span style="font-family: 宋体; ">。</span>release<span style="font-family: 宋体; ">会让</span>retain count<span style="font-family: 宋体; ">减</span>1<span style="font-family: 宋体; ">，只有</span>retain count<span style="font-family: 宋体; ">等于</span>0<span style="font-family: 宋体; ">，系统才会调用</span>dealloc<span style="font-family: 宋体; ">真正销毁这个对象。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[ClassA alloc] init]; //<span style="font-family: 宋体; ">对象生成时，</span>retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 release]; //release<span style="font-family: 宋体; ">使</span>retain count<span style="font-family: 宋体; ">减</span>1<span style="font-family: 宋体; ">，</span>retain count = 0<span style="font-family: 宋体; ">，</span>dealloc<span style="font-family: 宋体; ">自动被调用</span>,<span style="font-family: 宋体; ">对象被销毁</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">我们回头看看刚刚那个无效指针的问题，把</span>dealloc<span style="font-family: 宋体; ">改成</span>release<span style="font-family: 宋体; ">解决了吗？</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj2 = obj1; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 release]; //retain count = 0<span style="font-family: 宋体; ">，对象被销毁</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 hello];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 release];</p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [obj1 release]<span style="font-family: 宋体; ">之后，</span>obj2<span style="font-family: 宋体; ">依然是个无效指针。问题依然没有解决。解决方法见下一条。</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">4<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">指针赋值时，</span>retain count<span style="font-family: 宋体; ">不会自动增加，需要手动</span>retain<span style="font-family: 宋体; ">。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj2 = obj1; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="color: red; ">[obj2 retain]; //retain count = 2</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 release]; //retain count = 2 &#8211; 1 = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 release]; //retain count = 0<span style="font-family: 宋体; ">，对象被销毁</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">问题解决！注意，如果没有调用</span>[obj2 release]<span style="font-family: 宋体; ">，这个对象的</span>retain count<span style="font-family: 宋体; ">始终为</span>1<span style="font-family: 宋体; ">，不会被销毁，内存泄露。</span>(1-4<span style="font-family: 宋体; ">可以参考附件中的示例程序</span>memman-no-pool.m)</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">这样的确不会内存泄露，但似乎有点麻烦，有没有简单点的方法？见下一条。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">5<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">中引入了</span>autorelease pool<span style="font-family: 宋体; ">（自动释放对象池），在遵守一些规则的情况下，可以自动释放对象。（</span>autorelease pool<span style="font-family: 宋体; ">依然不是</span>.Net/Java<span style="font-family: 宋体; ">那种全自动的垃圾回收机制）</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">5.1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">新生成的对象，只要调用</span>autorelease<span style="font-family: 宋体; ">就行了，无需再调用</span>release<span style="font-family: 宋体; ">！</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1&nbsp;<span style="font-family: 宋体; ">但无需调用</span>release</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21pt; margin-bottom: 0pt; text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">5.2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">对于存在指针赋值的情况，代码与前面类似。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj2 = obj1; //retain count = 1</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="color: red; ">[obj2 retain]; //retain count = 2</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj1 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">//<span style="font-family: 宋体; ">对于</span>obj1<span style="font-family: 宋体; ">，无需调用（实际上不能调用）</span>release</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 hello]; //<span style="font-family: 宋体; ">输出</span>hello</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 42pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[obj2 release]; //retain count = 2-1 = 1</p><p style="text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">细心的读者肯定能发现这个对象没有被销毁，何时销毁呢？谁去销毁它？（可以参考附件中的示例程序</span>memman-with-pool.m<span style="font-family: 宋体; ">）请看下一条。</span></p><p style="text-indent: 21pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">6<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>autorelease pool<span style="font-family: 宋体; ">原理剖析。（其实很简单的，一定要坚持看下去，否则还是不能理解</span>Objective-C<span style="font-family: 宋体; ">的内存管理机制。）</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">6.1<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>autorelease pool<span style="font-family: 宋体; ">不是天生的，需要手动创立。只不过在新建一个</span>iphone<span style="font-family: 宋体; ">项目时，</span>xcode<span style="font-family: 宋体; ">会自动帮你写好。</span>autorelease pool<span style="font-family: 宋体; ">的真名是</span>NSAutoreleasePool<span style="font-family: 宋体; ">。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">6.2<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>NSAutoreleasePool<span style="font-family: 宋体; ">内部包含一个数组（</span>NSMutableArray<span style="font-family: 宋体; ">），用来保存声明为</span>autorelease<span style="font-family: 宋体; ">的所有对象。如果一个对象声明为</span>autorelease<span style="font-family: 宋体; ">，系统所做的工作就是把这个对象加入到这个数组中去。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1<span style="font-family: 宋体; ">，把此对象加入</span>autorelease pool<span style="font-family: 宋体; ">中</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">6.3<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>NSAutoreleasePool<span style="font-family: 宋体; ">自身在销毁的时候，会遍历一遍这个数组，</span>release<span style="font-family: 宋体; ">数组中的每个成员。如果此时数组中成员的</span>retain count<span style="font-family: 宋体; ">为</span>1<span style="font-family: 宋体; ">，那么</span>release<span style="font-family: 宋体; ">之后，</span>retain count<span style="font-family: 宋体; ">为</span>0<span style="font-family: 宋体; ">，对象正式被销毁。如果此时数组中成员的</span>retain count<span style="font-family: 宋体; ">大于</span>1<span style="font-family: 宋体; ">，那么</span>release<span style="font-family: 宋体; ">之后，</span>retain count<span style="font-family: 宋体; ">大于</span>0<span style="font-family: 宋体; ">，此对象依然没有被销毁，内存泄露。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; text-indent: -1cm; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">6.4<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; ">默认只有一个</span>autorelease pool<span style="font-family: 宋体; ">，通常类似于下面这个例子。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">int main (int argc, const char *argv[])</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; text-indent: 10.5pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">NSAutoreleasePool *pool;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; text-indent: 10.5pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">pool = [[NSAutoreleasePool alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; text-indent: 10.5pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">// do something</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; text-indent: 10.5pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[pool release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; text-indent: 10.5pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">return (0);</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">} // main</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; "><span style="font-size: 10.5pt; ">所有标记为</span><span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">autorelease</span><span style="font-size: 10.5pt; ">的对象都只有在这个</span><span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">pool</span><span style="font-size: 10.5pt; ">销毁时才被销毁</span>。如果你有大量的对象标记为</span>autorelease<span style="font-family: 宋体; ">，这显然不能很好的利用内存，在</span>iphone<span style="font-family: 宋体; ">这种内存受限的程序中是很容易造成内存不足的。例如：</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">int main (int argc, const char *argv[])</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">int i, j;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">for (i = 0; i &lt; 100; i++ )</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;for (j = 0; j &lt; 100000; j++ )</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; [NSString stringWithFormat:@"1234567890"];//<span style="font-family: 宋体; ">产生的对象是</span>autorelease<span style="font-family: 宋体; ">的。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">}</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[pool release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">return (0);</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">} // main</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.7pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">（可以参考附件中的示例程序</span>memman-many-objs-one-pool.m<span style="font-family: 宋体; ">，运行时通过监控工具可以发现使用的内存在急剧增加，直到</span>pool<span style="font-family: 宋体; ">销毁时才被释放）你需要考虑下一条。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 49.6pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 21.25pt; margin-bottom: 0pt; text-indent: -21.25pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">7<span style="font: normal normal normal 7pt/normal 'Times New Roman'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Objective-C<span style="font-family: 宋体; ">程序中可以嵌套创建多个</span>autorelease pool<span style="font-family: 宋体; ">。在需要大量创建局部变量的时候，可以创建内嵌的</span>autorelease pool<span style="font-family: 宋体; ">来及时释放内存。<span style="font-size: 10.5pt; "><span style="font-size: 10.5pt; ">（感谢网友</span><span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">hhyytt</span><span style="font-size: 10.5pt; ">和</span><span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">neogui</span><span style="font-size: 10.5pt; ">的提醒，某些情况下，系统会自动创建</span><span style="font-size: 10.5pt; font-family: Calibri, sans-serif; ">autorelease pool,&nbsp;</span><span style="font-size: 10.5pt; ">请参见第四章）</span></span></span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">int main (int argc, const char *argv[])</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">int i, j;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">for (i = 0; i &lt; 100; i++ )</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">{</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;for (j = 0; j &lt; 100000; j++ )</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; [NSString stringWithFormat:@"1234567890"];//<span style="font-family: 宋体; ">产生的对象是</span>autorelease<span style="font-family: 宋体; ">的。</span></p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;[loopPool release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">}</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">[pool release];</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 63pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">return (0);</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">} // main</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 52.5pt; margin-bottom: 0pt; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span style="font-family: 宋体; ">（可以参考附件中的示例程序</span>memman-many-objs-many-pools.m<span style="font-family: 宋体; ">，占用内存的变化极小）</span></p><p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; margin-bottom: 0pt; font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #ffffff; "><span style="font-family: 宋体; ">示例代码文件链接：</span><a href="http://files.cnblogs.com/VinceYuan/objective-c-memman.zip" target="_blank" style="color: #1d58d1; text-decoration: none; ">http://files.cnblogs.com/VinceYuan/objective-c-memman.zip</a></p></div><img src ="http://www.cppblog.com/cokecoffe/aggbug/161695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cokecoffe/" target="_blank">Wangkeke</a> 2011-12-07 21:46 <a href="http://www.cppblog.com/cokecoffe/articles/161695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iphone开发学习笔记</title><link>http://www.cppblog.com/cokecoffe/articles/149084.html</link><dc:creator>Wangkeke</dc:creator><author>Wangkeke</author><pubDate>Tue, 21 Jun 2011 02:21:00 GMT</pubDate><guid>http://www.cppblog.com/cokecoffe/articles/149084.html</guid><wfw:comment>http://www.cppblog.com/cokecoffe/comments/149084.html</wfw:comment><comments>http://www.cppblog.com/cokecoffe/articles/149084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cokecoffe/comments/commentRss/149084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cokecoffe/services/trackbacks/149084.html</trackback:ping><description><![CDATA[2011.6.21<br />
Cocoa：NexT公司（1996年被苹果收购）的NeXTSTEP操作系统内置的库和工具（Framework），后来改名为OpenStep，之后又命名为Cocoa。<br />
开发工具：Xcode，Interface builder<br />
开发语言：Object-C
<div>Framework&nbsp;</div>
<div>框架是一些类的集合,通常是一些可能一起使用的类集合.换句话说,这些类被一起编译成可复用的代码.加上相关的所有资源组成一个代扩展名.framework的目录(Mac OSX &nbsp; bundle &nbsp;的概念可以参考苹果的一些文档). &nbsp;系统自带的framework可以在 /System/Library/Frameworks 找到.&nbsp;</div>
<div>Cocoa 有3 个framework组成 :</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1. Foundation: &nbsp;所有的面向对象语言都会有一些标准结构: value , collection , &nbsp;String, dates, lists, thread 等等.所有的这些都在 Foundation framework里面(可以对比 C++的 STL)&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2. Appkit: &nbsp;所有和用户界面相关的类都在这里. Windows,buttons,text field, event,drawing. &nbsp;它还有个名字: ApplicationKit&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3. Core Data: Core Data 可以方便的让你把你的对象存储成文件,或是从文件中加载你的对象.</div>
<div>－－－－－－－－－－－－－－－－－分割线－－－－－－－－－－－－－－－－－－－－－－</div>
<div>2011.6.24</div>
<div>查询手册：</div>
<div>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #2b2b2b"><span style="font-size: 10pt; font-family: Verdana; ">Option-Double-Click 点击方法,类或是函数.XCode 会自动在帮助文档中查询它们.</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #2b2b2b"><span style="font-size: 10pt; font-family: Verdana; ">
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.6px Helvetica; color: #2b2b2b"><span style="font-family: Courier; font-size: 10pt; ">两种字符串进行转换:</span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal 'Courier New'; color: #2b2b2b; "><span style="font-family: Courier; font-size: 10pt; ">const char *foo = "Blah blah"; NSString *bar; // Create an NSString from a C string&nbsp;</span></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal 'Courier New'; color: #2b2b2b; "><span style="font-family: Courier; font-size: 10pt; ">bar = [NSString stringWithUTF8String:foo];</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px 'Courier New'; color: #2b2b2b"><span style="font-family: Courier; font-size: 10pt; ">// Create a C string from an NSString&nbsp;</span></p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px 'Courier New'; color: #2b2b2b"><span style="font-family: Courier; font-size: 10pt; ">foo = [bar UTF8String];</span></p>
</span></p>
</div><img src ="http://www.cppblog.com/cokecoffe/aggbug/149084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cokecoffe/" target="_blank">Wangkeke</a> 2011-06-21 10:21 <a href="http://www.cppblog.com/cokecoffe/articles/149084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>