﻿<?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>BlogJava-Natural-随笔分类-Objective-C</title><link>http://www.blogjava.net/Man/category/52498.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 08 Sep 2012 20:19:39 GMT</lastBuildDate><pubDate>Sat, 08 Sep 2012 20:19:39 GMT</pubDate><ttl>60</ttl><item><title>UITableView滚动时crash</title><link>http://www.blogjava.net/Man/archive/2012/09/07/387234.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Fri, 07 Sep 2012 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2012/09/07/387234.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/387234.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2012/09/07/387234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/387234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/387234.html</trackback:ping><description><![CDATA[照着网上的教程，吭哧吭哧写好了一个tableView，Run起来，界面出现了。还来不及高兴一下，一滚动，坑爹啊，直接crash掉了，退出。<br />
<br />打开调试模式，再重现一次，Debugger Console显示的结果是&#8220;Program received signal: "EXC_BAD_ACCESS"&#8221;.<br />这个结果表示代码中有数组越界或者哪里内存泄漏了。（网上教程不靠谱啊，完全照着教程敲代码竟然都错了）<br /><br />还好总共没几个方法，多加几个断点调试一下。<br />问题出来了：<span style="color: #000000; ">当向下滚动，调用cellForRowAtIndexPath</span>消息时，执行到第25行代码tableData已经被回收了。<br /><br />问题分析：<br />数组初始化放在viewDidLoad消息中，照着教程敲使用<strong><span style="background-color: #ff6600;">arrayWithObjects</span></strong>来创建。从语法上讲，此方法是autorelease的，不需要我们手动去release。<br />然而问题也出在这，当向下滚动时，不知为何在viewDidLoad初始化的数组都已经被回收了。<br /><br />修正方案：<br />把viewDidLoad消息中数组创建方法都改为[<strong><span style="background-color: #cc99ff;">[NSArray alloc] initWithObject</span></strong>: &#8230;&#8230;];方式创建，再在dealloc中释放掉就OK了。<br /><br />推断总结：<br />此代码的界面是用IB拉出来的，对于新人来说我们并不清楚它的view的创建细节。从执行效果来看，它在创建view时嵌套了个NSAutoreleasePool，向下滚动时已经把pool给release掉了，所以出现crash。<br /><br />得到教训就是：使用IB创建界面时，那些自定义的对象尽量使用alloc/retain/copy方式创建，自己release。把内存管理寄托在自动释放池中是不靠谱的，除非这个池是你自己创建并释放的。<br /><br /><br />
源代码如下<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)viewDidLoad&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;viewDidLoad];&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;tableData&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[NSArray&nbsp;&nbsp;arrayWithObjects:</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">香辣酱香骨</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">肉末烧豆腐</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">芙蓉虾</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">红烧带鱼</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">粉蒸排骨</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">自来红月饼</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">蛋黄莲蓉月饼</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">南瓜奶酪蛋糕</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">南瓜沙拉</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">五香毛豆</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">奶油冰淇淋</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">焦糖南瓜冰淇淋</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,nil];<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;thumbnails&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">[NSArray&nbsp;arrayWithObjects:</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">a.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">b.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">c.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">d.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">e.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">f.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">g.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">h.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">i.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">j.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">k.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">l.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,nil];<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;prepTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[NSArray&nbsp;arrayWithObjects:</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">10&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">5&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">5&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">10&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">8&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">30&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">30&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">45&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">20&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">5&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">50&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">40&nbsp;min</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,nil];<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(NSInteger)tableView:(UITableView&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)tableView&nbsp;numberOfRowsInSection:(NSInteger)section&nbsp;{<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;[tableData&nbsp;count];<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(UITableViewCell&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)tableView:(UITableView&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)tableView&nbsp;cellForRowAtIndexPath:(NSIndexPath&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)indexPath&nbsp;{<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;NSString&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">simpleTableIdentifier&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">SimpleTableItem</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;SimpleTableCell&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">cell&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(SimpleTableCell&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)[tableView&nbsp;dequeueReusableCellWithIdentifier:simpleTableIdentifier];<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(cell&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;nil){<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSArray&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">nib&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[[NSBundle&nbsp;mainBundle]&nbsp;loadNibNamed:</span><span style="color: #000000; ">@"</span><span style="color: #000000; ">SimpleTableCell</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;owner:self&nbsp;options:nil];<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[nib&nbsp;objectAtIndex:</span><span style="color: #000000; ">0</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;NSUInteger&nbsp;row&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[indexPath&nbsp;row];<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cell.nameLabel.text&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #000000; background-color: #ffff00;">tableData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">objectAtIndex:row];<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cell.thumbnailImageView.image&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[UIImage&nbsp;imageNamed:[thumbnails&nbsp;objectAtIndex:row]];<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;cell.prepTimeLabel.text&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[prepTime&nbsp;objectAtIndex:row];<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;cell;<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(CGFloat)tableView:(UITableView&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)tableView&nbsp;heightForRowAtIndexPath:(NSIndexPath&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)indexPath&nbsp;{<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">78</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)dealloc&nbsp;{<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;dealloc];<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">}</span></div><img src ="http://www.blogjava.net/Man/aggbug/387234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2012-09-07 11:33 <a href="http://www.blogjava.net/Man/archive/2012/09/07/387234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xcode修改xib文件要注意保存</title><link>http://www.blogjava.net/Man/archive/2012/09/05/387113.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Wed, 05 Sep 2012 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2012/09/05/387113.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/387113.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2012/09/05/387113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/387113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/387113.html</trackback:ping><description><![CDATA[xcode在图形界面编程这块是很强大，但在代码编辑方面就弱爆了。<br /><br />最近装了个黑苹果学习ios开发（xcode 3.2.5），xcode在代码文件修改后未保存时，文件名会有个阴影。但修改了xib未保存却是没有提示信息的。<br /><br />于是Run起来时发现跑起来的应用界面没变动，还是代码改动之前的那个效果。一开始以为是模拟器遭到缓存影响什么的，折腾了半天才无意发现是xib文件修改后未保存。<br /><br />自学新入的惨痛教训，谨记一下。继续摸索中&#8230;&#8230;<img src ="http://www.blogjava.net/Man/aggbug/387113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2012-09-05 17:03 <a href="http://www.blogjava.net/Man/archive/2012/09/05/387113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>