<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>“我”的开发笔记 &#187; 03 &#8211; 内存管理</title>
	<atom:link href="http://c.gzl.name/archives/category/cocoa/cmem/feed" rel="self" type="application/rss+xml" />
	<link>http://c.gzl.name</link>
	<description>IPhone, Cocoa, PHP, Javascript, JQuery, Actionscript, etc...</description>
	<lastBuildDate>Thu, 29 Dec 2011 07:20:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>NSString的内存管理 v.2011/12</title>
		<link>http://c.gzl.name/archives/606</link>
		<comments>http://c.gzl.name/archives/606#comments</comments>
		<pubDate>Mon, 05 Dec 2011 08:31:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[NSString]]></category>
		<category><![CDATA[内存管理]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=606</guid>
		<description><![CDATA[之前写过一个NSString的内存管理 不过好像由于之前的理解不深刻，所以写的时候也没有说明太清楚。 CS193P的笔记上有如下实例： aString = @"I am a string that 2 years old, man!"; 这种情况下，字符串储存和管理由系统做，我们不用操心。 aString = [NSString stringWithFormat:@"I am a string that %d years old, man!",2]; 第二种情况下，我们需要去retain和release这个字符串，系统不管。 这是之前写的内容。 为什么第一种我们不管这个产生的NSString的retain值呢？是因为其实由于我们建立了一个常量，无论我们retain还是release，对于这个对象都是没有意义的，大家可以尝试 NSString *foo = @&#34;ssff&#34;; &#91;foo release&#93;; &#91;foo release&#93;; 会发现，这样的代码并不会让程序崩溃，而且无论你再release几次都是一样的。 第二种其实就是利用NSString 方法来生成一个NSString对象，这个时候我们要招呼到这个对象的retain值，否则就是内存溢出了。而我当时说的并不是一定要releaes或者retain这个stringWithFormat便捷方法产生的对象&#8230; 我语文不好，哈哈。便捷方法产生的都是autorelease的对象，谢谢大家的留言！]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/606/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>retain和copy的区别</title>
		<link>http://c.gzl.name/archives/339</link>
		<comments>http://c.gzl.name/archives/339#comments</comments>
		<pubDate>Fri, 14 Aug 2009 04:11:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[property]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=339</guid>
		<description><![CDATA[原来简单解释过属性定义（Property） ，并且提起了简单的retain，copy，assign的区别。那究竟是有什么区别呢？ assign就不用说了，因为基本上是为简单数据类型准备的，而不是NS对象们。 Retain vs. Copy!! copy： 建立一个索引计数为1的对象，然后释放旧对象 retain：释放旧的对象，将旧对象的值赋予输入对象，再提高输入对象的索引计数为1 那上面的是什么该死的意思呢？ Copy其实是建立了一个相同的对象，而retain不是： 比如一个NSString对象，地址为0&#215;1111，内容为@&#8221;STR&#8221; Copy到另外一个NSString之后，地址为0&#215;2222，内容相同，新的对象retain为1，旧有对象没有变化 retain到另外一个NSString之后，地址相同（建立一个指针，指针拷贝），内容当然相同，这个对象的retain值+1 也就是说，retain是指针拷贝，copy是内容拷贝。哇，比想象的简单多了&#8230;]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/339/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>误释放对象</title>
		<link>http://c.gzl.name/archives/204</link>
		<comments>http://c.gzl.name/archives/204#comments</comments>
		<pubDate>Thu, 25 Jun 2009 00:48:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=204</guid>
		<description><![CDATA[W 问题一： value = &#91;array objectAtIndex:n&#93;; //得到一个数组中的对象 &#91;arry removeObjectAtIndex:n&#93;; //卸载那个对象 因为value得到了那个对象，但是由于另外一个拥有者release了该对象，所以其实value现在成了摇摆指针（无效数据） 问题二： myArray = &#91;NSArray array&#93;; ... &#91;myArray release&#93;; NSArray返回的是一个自动释放对象，不仅myArray不应该在一段时间后release，而应该在适当的时候先retain，以防止该array被系统误释放。 问题三： rocket = &#91;rocketLauncher aRocket&#93;; &#91;rocketLauncher release&#93;; 和array这种数据收集类对象一样，如果我们得到了一个类的子对象而不retain它，那么在原父类被释放的时候，这个rocket其实也会失去其意义。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/204/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cocoa不同内存管理环境下的autorelease</title>
		<link>http://c.gzl.name/archives/201</link>
		<comments>http://c.gzl.name/archives/201#comments</comments>
		<pubDate>Thu, 25 Jun 2009 00:36:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[autorelease]]></category>
		<category><![CDATA[Garbage Collection]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=201</guid>
		<description><![CDATA[H 混合内存管理环境：垃圾收集法（Garbage Collection）+索引计数法（Reference Counting） 虽然大多数情况下混合环境是不被推荐的，但是如果在这个情况下，autorelease需要注意以下事项： 垃圾收集混合环境下：应该使用drain方法，因为release在GC模式下没有意义 索引计数环境下：drain和release对于autoreleasepool（自动释放池）的效果相同]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/201/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>对autorelease的误解</title>
		<link>http://c.gzl.name/archives/197</link>
		<comments>http://c.gzl.name/archives/197#comments</comments>
		<pubDate>Thu, 25 Jun 2009 00:18:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[autorelease]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=197</guid>
		<description><![CDATA[A Cocoa的内存管理分为 索引计数法（Reference Counting/ Retain Count）和 垃圾收集法（Garbage Collection）。而iPhone上目前只支持前者，所以autorelease就成为很多人的“捷径”。 但是！autorelease其实并不是“自动释放”，不像垃圾收集法，对对象之间的关系侦测后发现垃圾-删除。但是autorelease其实是“延后释放”，在一个运行周期后被标记为autorelease会被释放掉。 切记小心使用autorelease，理解autorelease，防止在你还需要该对象的时候已经被系统释放掉了。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/197/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface Builder参与的内存管理问题</title>
		<link>http://c.gzl.name/archives/113</link>
		<comments>http://c.gzl.name/archives/113#comments</comments>
		<pubDate>Tue, 16 Jun 2009 20:29:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[05 - 视图（View）]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[IB]]></category>
		<category><![CDATA[IBOutlet]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[内存管理]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=113</guid>
		<description><![CDATA[I 要点： 如果一个变量在类中被定义为了 IBOutlet 那么你无需对其进行实例化，xib载入器会对其初始化。 如果一个变量在类中被定义为了 IBOutlet 那么你必须负责将其释放。xib载入器不会帮忙的&#8230; &#8230; *切不要初始化两回，内存会溢出，而且对象锁定也会出错。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/113/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于索引计数（Reference Counting）的问题</title>
		<link>http://c.gzl.name/archives/98</link>
		<comments>http://c.gzl.name/archives/98#comments</comments>
		<pubDate>Tue, 16 Jun 2009 17:49:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[autorelease]]></category>
		<category><![CDATA[Reference Counting]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[retain]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=98</guid>
		<description><![CDATA[M *retain值 = 索引计数（Reference Counting） NSArray对象会retain（retain值加一）任何数组中的对象。当NSArray被卸载（dealloc）的时候，所有数组中的对象会被执行一次释放（retain值减一）。不仅仅是NSArray，任何收集类（Collection Classes）都执行类似操作。例如NSDictionary，甚至UINavigationController。 Alloc/init建立的对象，索引计数为1。无需将其再次retain。 [NSArray array]和[NSDate date]等“方法”建立一个索引计数为1的对象，但是也是一个自动释放对象。所以是本地临时对象，那么无所谓了。如果是打算在全Class中使用的变量（iVar），则必须retain它。 缺省的类方法返回值都被执行了“自动释放”方法。（*如上中的NSArray） 在类中的卸载方法“dealloc”中，release所有未被平衡的NS对象。（*所有未被autorelease，而retain值为1的）]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/98/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NSString的内存管理</title>
		<link>http://c.gzl.name/archives/81</link>
		<comments>http://c.gzl.name/archives/81#comments</comments>
		<pubDate>Mon, 15 Jun 2009 22:22:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[NSString]]></category>
		<category><![CDATA[内存管理]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=81</guid>
		<description><![CDATA[CS193P的笔记上有如下实例： aString = @&#34;I am a string that 2 years old, man!&#34;; 这种情况下，字符串储存和管理由系统做，我们不用操心。 aString = &#91;NSString stringWithFormat:@&#34;I am a string that %d years old, man!&#34;,2&#93;; 第二种情况下，我们需要去retain和release这个字符串，系统不管。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/81/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Objective-C内存管理</title>
		<link>http://c.gzl.name/archives/79</link>
		<comments>http://c.gzl.name/archives/79#comments</comments>
		<pubDate>Mon, 15 Jun 2009 22:07:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[assign]]></category>
		<category><![CDATA[autorelease]]></category>
		<category><![CDATA[copy]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[内存管理]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=79</guid>
		<description><![CDATA[1，你初始化（alloc/init）的对象，你需要释放（release）它。例如： NSMutableArray aArray = &#91;&#91;NSArray alloc&#93; init&#93;; 后，需要 &#91;aArray release&#93;; 2，你retain或copy的，你需要释放它。例如： &#91;aArray retain&#93; 后，需要 &#91;aArray release&#93;; 3，被传递(assign)的对象，你需要斟酌的retain和release。例如： obj2 = &#91;&#91;obj1 someMethod&#93; autorelease&#93;; 对象2接收对象1的一个自动释放的值，或传递一个基本数据类型（NSInteger，NSString）时： 你或希望将对象2进行retain，以防止它在被使用之前就被自动释放掉。但是在retain后，一定要在适当的时候进行释放。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/79/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为什么不能直接调用dealloc而是release</title>
		<link>http://c.gzl.name/archives/75</link>
		<comments>http://c.gzl.name/archives/75#comments</comments>
		<pubDate>Mon, 15 Jun 2009 21:33:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[01 - 基础信息]]></category>
		<category><![CDATA[02 - Objective-C]]></category>
		<category><![CDATA[03 - 内存管理]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[dealloc]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=75</guid>
		<description><![CDATA[M 在看过CS193P的笔记后，以下是真正有用的句子： dealloc不等于C中的free，dealloc并不将内存释放，也不会将索引计数（Reference counting）降低。于是直接调用dealloc反而无法释放内存。 在Objective-C中，索引计数是起决定性作用的。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/75/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

