<?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; Cocoa开发</title>
	<atom:link href="http://c.gzl.name/archives/category/cocoa/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>Mac: 基于事件的XML解析器(NSXMLParser)</title>
		<link>http://c.gzl.name/archives/570</link>
		<comments>http://c.gzl.name/archives/570#comments</comments>
		<pubDate>Sat, 19 Jun 2010 06:38:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[NSXMLParser]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=570</guid>
		<description><![CDATA[XML用处很大&#8230; 用得很广&#8230; 最简单的来说用PHP和Javascript, JQuery都可以简单解析一个整齐的树结构XML文件 但是我们可爱的佛典网XML为复杂结构, 于是乎xslt帮不上什么忙了&#8230;&#8230;我希望在新版的佛典中能包含所有的佛经, 于是简单并且高效的使用所有中华佛典网上的XML就是我的目标了. 于是,基于事件的XML解析器(Event-Driven XML Parser) NSXMLParser 就是我必须用到的了 继续前面的两篇Mac平台程序设计 Mac:打开一个目录 Mac:得到一个目录内的内容 1, 更改界面, 添加一个&#8221;解析一个目录里面的第一个的文件&#8221;的按钮 2, 构建XML解析部分 //1, 构建解析方法 -&#40;void&#41;parseXMLFile:&#40;NSURL *&#41;XMLURL //XMLURL为第一个文件的URL &#123; NSXMLParser *eventParser = &#91;&#91;NSXMLParser alloc&#93; initWithContentsOfURL:XMLURL&#93;; &#91;eventParser setDelegate:self&#93;; //设置代理为本地 &#91;eventParser parse&#93;; //开始解析 &#160; NSLog&#40;@&#34;end Of parseXMLFile&#34;&#41;; &#125; //2, 解析开始后,所有XML的内容由NSXMLParserDelegate处理 // 所以一定要注意在本地添加&#60;NSXMLParserDelegate&#62;到文件头 //在NSXMLParser读到&#60;p&#62;的时候重写一个&#60;p&#62;标签,原来的是XML中的,无法直接使用 - &#40;void&#41;parser:&#40;NSXMLParser *&#41;parser didStartElement:&#40;NSString *&#41;elementName namespaceURI:&#40;NSString *&#41;namespaceURI [...]]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/570/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac:得到一个目录内的内容</title>
		<link>http://c.gzl.name/archives/568</link>
		<comments>http://c.gzl.name/archives/568#comments</comments>
		<pubDate>Fri, 18 Jun 2010 06:49:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[NSFileManager]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=568</guid>
		<description><![CDATA[首先是打开一个目录 然后 1, 使用NSFileManager来得到这个目录的内容 NSArray *contentArray = &#91;&#91;NSFileManager defaultManager&#93; contentsOfDirectoryAtURL:&#91;&#91;oPanel URLs&#93; objectAtIndex:0&#93; //oPanel是上个帖子中的NSOpenPanel对象 includingPropertiesForKeys:&#91;NSArray array&#93; options:0 error:nil&#93;; //我们得到一个Array的NSURL 2, 简单显示这个Array中的内容 for&#40;id innerUrl in contentArray&#41; &#123; NSLog&#40;&#91;innerUrl absoluteString&#93;&#41;; &#125; 3, 结果 run [Switching to process 3626] Running… 2010-06-17 23:32:43.409 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0001.xml 2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0002.xml 2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0003.xml 2010-06-17 23:32:43.411 XML2HTML[3626:a0f] file://localhost/Users/kingmtn/Downloads/T01/T01n0004.xml 2010-06-17 23:32:43.411 XML2HTML[3626:a0f] [...]]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/568/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac:打开一个目录</title>
		<link>http://c.gzl.name/archives/564</link>
		<comments>http://c.gzl.name/archives/564#comments</comments>
		<pubDate>Fri, 18 Jun 2010 06:02:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[06 - 菜单句柄]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[NSButton]]></category>
		<category><![CDATA[NSOpenPanel]]></category>
		<category><![CDATA[XML2HTML]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=564</guid>
		<description><![CDATA[1, 获得一个打开窗口对象 NSOpenPanel NSOpenPanel *oPanel = &#91;NSOpenPanel openPanel&#93;; //快捷建立方式不用释放, 我还记得, 你呢? 2, 设置这个对象的参数 &#91;oPanel setCanChooseDirectories:YES&#93;; //可以打开目录 &#91;oPanel setCanChooseFiles:NO&#93;; //不能打开文件(我需要处理一个目录内的所有文件) &#91;oPanel setDirectory:NSHomeDirectory&#40;&#41;&#93;; //起始目录为Home 3, 处理得到的数据 if &#40;&#91;oPanel runModal&#93; == NSOKButton&#41; &#123; //如果用户点OK NSLog&#40;&#91;&#91;&#91;oPanel URLs&#93; objectAtIndex:0&#93; absoluteString&#93;&#41;; //我在console输出这个目录的地址 &#125; 4, 结果 [Switching to process 3330] Running… 2010-06-17 22:49:02.583 XML2HTML[3330:a0f] file://localhost/Users/kingmtn/Music/ 5, 简单的界面 只需要一个NSButton,并且将这个NSButton的缺省行为链接到我的对象方法-(IBAction)openDirectoryButtonClick:(id)sender上就可以了 *这是我XML2HTML工程的第一部分]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/564/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>用Icon Composer制作Mac/iPhone程序图标</title>
		<link>http://c.gzl.name/archives/493</link>
		<comments>http://c.gzl.name/archives/493#comments</comments>
		<pubDate>Tue, 05 Jan 2010 03:58:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[小窍门]]></category>
		<category><![CDATA[Icon]]></category>
		<category><![CDATA[Icon Composer]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[图标]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=493</guid>
		<description><![CDATA[上传过App Store的人还记得自己需要制作的各种尺寸的图标么？ 制作Mac/iPhone的图标的工作就不用Firework/Photoshop了吧&#8230; 对！Apple的Developer文件夹不是白给的！（冷静&#8230;） 请大家找到Icon Composer，下面是路径～～ 打开这个程序，不是很帅的程序，五个方块&#8230; 大家可以看到Mac程序中需要的各种尺寸的图标咯，怎么用呢？很简单拉～ 拽一个图片进去就自动变成那个尺寸了，顺便说一下：试试png，别用jpg&#8230; 我知道这个长方的图标很2，我手头就是这个墙纸了&#8230;方格间可以随便拽～～ 看到自己喜欢的尺寸了么？文件-&#62;保存成icon文件就可以咯！哇啦～～]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/493/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>makeKeyAndVisible</title>
		<link>http://c.gzl.name/archives/466</link>
		<comments>http://c.gzl.name/archives/466#comments</comments>
		<pubDate>Sun, 06 Sep 2009 23:14:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[05 - 视图（View）]]></category>
		<category><![CDATA[09 - 视图/绘图]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[makeKeyAndVisible]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=466</guid>
		<description><![CDATA[我不知道为什么，不过有人搜索makeKeyAndVisible方法。其实我这种懒人一般不会刨根问底，有些方法照打就好，那些白给的方法有些就别动就好了。 我们看看这个每个程序都有的方法吧： &#91;window makeKeyAndVisible&#93;; 由于iPhone是单窗口程序，所以也就只有这么一个Window对象，而且是UIWindow，不是NSWindow。而根据文档上所说： “这个是便捷方法，去使被使用对象的主窗口显示到屏幕的最前端。你也可以使用hiddenUIView方法隐藏这个窗口” 所以基本上来说，对于编程者的区别仅仅在于在其前添加代码，或在其后添加代码。]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/466/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在iPhone程序上读取PDF文件 (rev0.1 ^-^;)</title>
		<link>http://c.gzl.name/archives/460</link>
		<comments>http://c.gzl.name/archives/460#comments</comments>
		<pubDate>Sun, 06 Sep 2009 05:57:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[05 - 视图（View）]]></category>
		<category><![CDATA[09 - 视图/绘图]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[Q2D]]></category>
		<category><![CDATA[Quartz 2D]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=460</guid>
		<description><![CDATA[老话，最近闹心的事情多，开心的事情少，但是正事还是要干的。学习得需要，努力的需要，钱的需要&#8230; &#8230; 天上给我下点儿钞票吧！ 言归正传，怎么在iPhone程序中读取PDF的内容呢？答案是，苹果为我们准备了一个很神奇的framework Q2D（Quartz 2D）。Q2D提供了全套的PDF读取API，接下来我们来看看如果简单的使用Q2D来读取PDF文件： 我建立了一个工程叫iPhonePDF, 添加了一个UIScrollView（不知道怎么添加UIScrollView? 添加一个UIView然后把interface上的UIView改成UIScrollView就可以啦&#8230;）名为PDFView 看看PDFView里面有什么吧 @interface PDFView : UIScrollView &#123; &#160; NSString *filePath; CGPDFDocumentRef pdfDocument; CGPDFPageRef page; int pageNumber; &#125; &#160; @property &#40;copy, nonatomic&#41; NSString *filePath; @property int pageNumber; &#160; -&#40;CGPDFDocumentRef&#41;MyGetPDFDocumentRef; -&#40;void&#41;reloadView; -&#40;IBAction&#41;goUpPage:&#40;id&#41;sender; -&#40;IBAction&#41;goDownPage:&#40;id&#41;sender; @end filePath是储存pdf文件的位置的，得到文件位置就是老话题了：[NSBundle mainBundle]&#8230; 后面的会写吧&#8230; 不记得了在我博客里面搜索吧 CGPDFDocumentRef是PDF文档索引文件，Q2D是Core Foundation的API，所以没看到那个星星～ CGPDFPageRef是PDF页面索引文件 pageNumber是页码 下面的几个函数其实一看就明了了，翻页的，和刷新页面的。第一个是自定义的getter 然后我们看看m文件里面有用的方法： @implementation PDFView @synthesize filePath,pageNumber; &#160; [...]]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/460/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>循环使用整个NSArray内的对象</title>
		<link>http://c.gzl.name/archives/450</link>
		<comments>http://c.gzl.name/archives/450#comments</comments>
		<pubDate>Fri, 04 Sep 2009 01:08:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[02 - Objective-C]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[NSArray]]></category>
		<category><![CDATA[NSEnumerator]]></category>
		<category><![CDATA[循环]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=450</guid>
		<description><![CDATA[循环使用整个NSArray内的对象是非常常用的了，而且最近我在研究究竟怎么能方便的把NSArray存入Core Data，所以这更是必要了，看看如下的方法吧： 1，Objective-C 2.0法，最应该使用的 NSArray *aArray; //我们的Array，假设他已经初始化有内容了 &#160; for&#40;id innerObj in aArray&#41; //id可以由其他对象类型替代 &#123; //也就是说, 在循环中的参数innerObj就是aArray中的对象 //由于NSArray中只能储存对象，所以我们使用id作为内涵对象的类型，其实就是个指针了 //而且如果NSArray中的内容不一致，id更不会出现冲突 &#125; 2，C的老方法，不推荐，低性能 NSArray *aArray; //我们的Array，假设他已经初始化有内容了 &#160; for&#40;int i=0;i&#60;&#91;aArray count&#93;; i++&#41; &#123; &#91;&#91;aArray objectAtIndex:i&#93; 然后作你想作的事情&#93;; //做爱 作的事情... &#125; 3, 用NSEnumerator（不知道怎么翻译阿&#8230;.） NSEnumerator* myIterator = &#91;myArray reverseObjectEnumerator&#93;; id anObject; &#160; while&#40; anObject = &#91;myIterator nextObject&#93;&#41; //每次读取“逐读器”的下一个对象 &#123; //anObject和刚才的innerObj是一个意思，但是看看多了这么多行 &#125; 结语： [...]]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/450/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>答问留言：关于NSOperation</title>
		<link>http://c.gzl.name/archives/444</link>
		<comments>http://c.gzl.name/archives/444#comments</comments>
		<pubDate>Fri, 04 Sep 2009 00:12:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[10 - 性能调试]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[Q&A]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[NSInvocationOperation]]></category>
		<category><![CDATA[NSOperation]]></category>
		<category><![CDATA[NSOperationQueue]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=444</guid>
		<description><![CDATA[1，operationQueue 里边应该可以同时添加多个operation吧？ 是的，本来operationQueue的目的就是多线程管理，那多线程，可不只是一个线程。 而且我们可以设置这个队列每次被处理的“操作”数量 NSOperationQueue *aQ = &#91;&#91;NSOperationQueue alloc&#93; init&#93;; &#91;aQ setMaxConcurrentOperationCount:10&#93;; 这里的setMaxConcurrentOperationCount就是同时被处理的“操作数”，参数为整数int或NSInteger (两个是一样的，不记得的可以在我的博客里面搜索一下噢～) 2，那main函数应该怎么写？ main函数中其实只需要写你要在另外一个进程里面作的事情。比如对于我来说，我常常只是作一个简单的事情，那我会用NSInvocationOperation，NSOperation的简化版。比如说： NSInvocationOperation *aOpt = &#91;&#91;NSInvocationOperation alloc&#93; initWithTarget:self selector:@selector&#40;doSomeThing&#41; object:nil&#93;; &#160; - &#40;void&#41;doSomeThing &#123; //读取大量大延迟数据等等 //可以使用performSelectorOnMainThread来将得来的数据返回到主线程 &#125; 在doSomeThing函数里面，我可以从网上读取一些东西，但是读取是需要占用时间，而堵塞主线程的。而使用NSOperation这样使用就不会了。 而如果是NSOperation，虽然复杂了一些，又是做一个NSOperation的子类。其实main函数做得事情和doSomeThing是一抹一样的。只不过如果你制作这个子类，你对其操作的内容可以更多，可以制作更复杂的读取，载入操作等等，而且你可以重复使用这个类功能阿。再者，NSOperation也提供了对runtime操作的支持，不过那就太麻烦了，一般不大用的上。 最近麻烦事情真是太多了，而且还都不顺利，死的心都有阿。还好有这么多好朋友支持我，我这个博客也一点儿一点儿的有回复了&#8230;大家别那么冷漠，管我写的好还是不好，按东北话来说“吱一声”嘛～唉，我要加油阿！我还有那么多的事情没办到呢，怎么能放弃！他妈的！！！！！阿！！！！！！]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/444/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>从0开始Core Data（1）</title>
		<link>http://c.gzl.name/archives/431</link>
		<comments>http://c.gzl.name/archives/431#comments</comments>
		<pubDate>Tue, 01 Sep 2009 19:02:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[09 - 数据（Data）]]></category>
		<category><![CDATA[15 - CoreData]]></category>
		<category><![CDATA[Cocoa开发]]></category>
		<category><![CDATA[iPhone开发]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[CoreData]]></category>
		<category><![CDATA[Xcode]]></category>
		<category><![CDATA[数据管理]]></category>

		<guid isPermaLink="false">http://c.gzl.name/?p=431</guid>
		<description><![CDATA[大家都有Snow Leopard和XCode 3.2了吧？会发现XCode变了不少，帅拉！ 那我们点击“Create a new Xcode project”来开始我们的Core Data程序工程吧！ 在这里，XCode已经给我们准备好了一个几乎可以直接去用的程序模板，直接选择“基于导航的应用程序”，然后记得点选“Use Core Data for storage” 建立好的程序名为XCDtest01，我们尝试编译运行，看看得到的程序是什么样的： 基本上来说，这个程序把什么都给我们弄好了，一个程序，在点击添加按钮之后添加现在的时间标签，如果点击“Edit”编辑按钮，就进入编辑模式，可以删除任意条信息。 如果点开xcdatamodel文件，我们可以看到，其中的实体为Event，有一个参数，名为“时间标签”。也就是说，如果我们想对这个列表视图中的数据作更改，只需要适当更改这个实体的参数，并配置- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 代理条目就可以显示适当的内容了。 这个预置程序与我们之前讨论的程序不同的，在于这个程序中并没有配置一个可变数组（NSMutableArray）来作数据副本，以达到高速存储的目的。因为Core Data在向磁盘和内存操作，NSMutableArray是内存操作，速度上比较有优势。但是我们有的这个小程序太小了，再者苹果有可能认为那种方法是非标准的。所以在这里才没有那么作 NSManagedObject *managedObject = &#91;fetchedResultsController objectAtIndexPath:indexPath&#93;; cell.textLabel.text = &#91;&#91;managedObject valueForKey:@&#34;timeStamp&#34;&#93; description&#93;; 在这个程序的cell配置代理里面，仅仅是从“获取操作控制器”中得到了“被管理对象”，然后再读取其中的内容到cell的text中。 希望大家也使用这个模板，自己创建一个Core Data程序，然后简单的理解一下代码。下次我们聊只使用基于Window的程序模板+Core Data来创建程序]]></description>
		<wfw:commentRss>http://c.gzl.name/archives/431/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

