IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
来源:互联网 发布:查看路由器mac地址 编辑:程序博客网 时间:2024/05/16 09:59
<div id="article_details" class="details">
<div class="article_title">
<span class="ico ico_type_Repost"></span>
<h1>
<span class="link_title"><a href="/decemberd/article/details/18309513">
IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多线程</a><a href="http://www.csdn.net/tag/%e5%a4%9a%e6%a0%b8" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多核</a><a href="http://www.csdn.net/tag/%e5%b9%b6%e5%8f%91" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">并发</a><a href="http://www.csdn.net/tag/ios" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">ios</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2014-01-15 14:03</span>
<span class="link_view" title="阅读次数">6077人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('IOS多线程(NSThread,NSOperation,Grand Central Dispatch)','18309513');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(18309513,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('955448','decemberd','top','18309513');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">iphone开发<em>(65)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/decemberd/article/category/955448" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_955448">
</ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div id="article_content" class="article_content">
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>文档转自:http://www.cnblogs.com/BinShao/p/zhibin.html</strong></p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>•NSThread</strong>:</p>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–优点:NSThread 比其他两个轻量级,使用简单</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>•NSOperation</strong>:</div>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–NSOperation是面向对象的</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<span style="line-height:19px"> <span style="color:rgb(255,0,0)">- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;</span></span></p>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
•如果要更新UI界面,可以在后台线程中调用<span style="line-height:19px; color:rgb(255,0,0)">performSelectorOnMainThread</span>方法</div>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<span style="line-height:19px">•提示</span>:尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread 方法,以避免不必要的麻烦</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<div>•开启后台执行任务的方法</div>
<div> </div>
<div class="O1"> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">-(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg</span></span></div>
<div class="O1"> </div>
<div>•在后台线程中通知主线程执行任务的方法</div>
<div> </div>
<div class="O1"> <span style="line-height:19px; color:rgb(255,0,0)"> –(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;</span></div>
<div class="O1"> </div>
<div>•获取线程信息</div>
<div> </div>
<div> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">[NSThread currentThread];</span></span></div>
<div> </div>
<div>•线程休眠</div>
<div> </div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">[NSThread sleepForTimeInterval:1.0f];</span></div>
<div> </div>
<div> </div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)"> + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;</span></div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)"> - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;</span></div>
<div>
<div>•detachNewThreadSelector方法会直接启动线程方法</div>
<div>•initWithTarget需要调用start方法才能够启动线程方法</div>
</div>
<div>•参数说明:</div>
<div class="O1"> –selector:线程执行的方法,只能有一个参数,不能有返回值</div>
<div class="O1"> –target:selector消息发送的对象</div>
<div class="O1"> –argument:传输给target的唯一参数,也可以是nil</div>
<div class="O1"> </div>
<div class="O1">
<div>•NSOperation的两个子类</div>
<div class="O1"> 1.NSInvocationOperation</div>
<div class="O1"> 2.NSBlockOperation</div>
<div>•工作原理:</div>
<div class="O1"> 1.用NSOperation封装要执行的操作</div>
<div class="O1"> 2.将创建好的NSOperation对象放NSOperationQueue中</div>
<div class="O1"> 3.启动OperationQueue开始新的线程执行队列中的操作</div>
<div>•注意事项:</div>
<div class="O1"> 1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢</div>
<div class="O1"> 2.使用以下方法可以控制并发的线程数量:</div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)">-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;</span></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)">NSInvocation/NSBlockOperation演练</span></div>
<div class="O1"><span style="line-height:19px"><img src="http://images.cnitblog.com/blog/594870/201312/27213224-c704efb7ea8041059aafd52be616684e.png" alt="" style="border:0px"></span></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1">通过<span style="line-height:19px; color:rgb(255,0,0)">addDependency</span>建立线程之间的联系 / 限制线程数量</div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213341-b47c1ee80a6f44d880a002e9ec5e4398.png" alt="" style="border:0px"></div>
<div class="O1">
<div class="O1">
<div class="O1">
<div class="O1">
<div>•GCD队列:</div>
<div>
<div class="O1"> –Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术</div>
<div class="O1"> –GCD是基于C语言的</div>
</div>
<div>
<div>GCD的优点:</div>
<div class="O1"> –充分利用多核</div>
<div class="O1"> –所有的多线程代码集中在一起,便于维护</div>
<div class="O1"> –GCD中无需使用@autoreleasepool</div>
<div class="O1"> -如果要顺序执行,可以使用dispatch_sync同步方法</div>
<div class="O1"> -dispatch_async无法确定任务的执行顺序</div>
<div class="O1"> </div>
</div>
<div class="O1">1.全局队列:所有添加到主队列中的任务都是并发执行的</div>
<div class="O1">
<div> •全局队列(可能会开启多条线程)</div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);</span></div>
</div>
<div class="O1">2.串行队列:所有添加到串行队列中的任务都是顺序执行的</div>
<div class="O1">
<div><span style="line-height:19px"> •串行队列(只可能会开启一条线程)</span></div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);</span></div>
</div>
<div class="O1">3.主队列:所有添加到主队列中的任务都是在主线程中执行的</div>
<div class="O1">
<div><span style="line-height:19px"> •主队列</span></div>
<div> <span style="line-height:19px; color:rgb(255,0,0)"> dispatch_get_main_queue();</span></div>
</div>
</div>
</div>
</div>
<p style="margin:10px auto"> •异步操作</p>
<p style="margin:10px auto"> –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_async</span> 在其他线程执行任务,会开启新的线程</p>
<p style="margin:10px auto"> –异步方法无法确定任务的执行顺序 </p>
<div>•同步操作</div>
<p style="margin:10px auto"> –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_sync</span> 在当前在当前线程执行任务,不开启新的线程</p>
<div class="O1"> –同步操作与队列无关</div>
<div class="O1"> </div>
<div class="O1"> –同步方法会依次执行,能够决定任务的执行顺序</div>
<div class="O1"> </div>
<div class="O1"> –更新界面UI时,最好使用同步方法</div>
<p style="margin:10px auto"><span style="line-height:19px">GCD</span>就是为了在<span style="line-height:19px">“</span>多核<span style="line-height:19px">”</span>上使用多线程技术</p>
<p style="margin:10px auto"> 1> <span style="line-height:19px">要使用</span>GCD<span style="line-height:19px">,所有的方法都是</span><span style="line-height:19px; color:rgb(255,0,0)">dispatch</span><span style="line-height:19px">开头的</span></p>
<p style="margin:10px auto"> 2> <span style="line-height:19px">名词解释</span></p>
<p style="margin:10px auto"> global <span style="line-height:19px">全局</span></p>
<p style="margin:10px auto"> queue 队列</p>
<p style="margin:10px auto"> async 异步</p>
<p style="margin:10px auto"> sync <span style="line-height:19px">同步</span> </p>
<p style="margin:10px auto"><span style="line-height:19px"> 3> </span>要执行异步的任务,就在全局队列中执行即可</p>
<p style="margin:10px auto"> dispatch_async 异步执行控制不住先后顺序</p>
<p style="margin:10px auto"> 4> <span style="line-height:19px">关于</span>GCD<span style="line-height:19px">的队列</span></p>
<p style="margin:10px auto"> 全局队列 <span style="line-height:19px; color:rgb(255,0,0)">dispatch_get_global_queue</span></p>
<p style="margin:10px auto"> <span style="line-height:19px">参数:优先级</span> <span style="line-height:19px; color:rgb(255,0,0)">DISPATCH_QUEUE_PRIORITY_DEFAULT</span></p>
<p style="margin:10px auto"> <span style="line-height:19px">始终是</span> 0</p>
<p style="margin:10px auto"> <span style="line-height:19px">串行队列</span> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);</span></span></p>
<p style="margin:10px auto"><span style="line-height:19px"> </span>是创建得到的,不能直接获取</p>
<p style="margin:10px auto"> <span style="line-height:19px">主队列</span> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_get_main_queue</span></p>
<p style="margin:10px auto"><span style="line-height:19px"> 5> </span>异步和同步与方法名无关,与运行所在的队列有关!</p>
<p style="margin:10px auto"><span style="line-height:19px"> </span>提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!同步主要用来控制方法的被调用的顺序</p>
<div class="O1">
<div class="O1">
<div class="O1"> </div>
<div class="O1"><span style="line-height:19px"><img src="http://images.cnitblog.com/blog/594870/201312/27213509-11cf84778c934be3b2dc97de5857716a.png" alt="" style="border:0px; width:729px"></span></div>
</div>
</div>
</div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213624-39262600d65e4221b659fd8415ca9343.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213654-3b32def361854624b81e4284adc7425d.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px"><strong>---------------------线程锁-------------------</strong></span></div>
<div class="O1"> </div>
<div class="O1"><strong><img src="http://images.cnitblog.com/blog/594870/201312/27213735-3a13c6bf125540639d785eed470ec250.png" alt="" style="border:0px"></strong></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px"><strong>---------------------通过NSBlockOperation内存缓存-------------------</strong></span></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213833-0421fc535159469c9dbcb5e5c5cef379.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px">---------------------内存管理-------------------</span></div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213852-7121e21e915448cbaa778e56dd949c37.png" alt="" style="border:0px"></div>
<div class="O1"> </div>
<div class="O1"> </div>
</div>
</div>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1477380549130">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.14-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=410384"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="18309513">
<dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
<dt>顶</dt>
<dd>0</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
<dt>踩</dt>
<dd>0</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/decemberd/article/details/18083009';">上一篇</span><a href="/decemberd/article/details/18083009" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">iOS项目的目录结构和开发流程</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('955448','decemberd','foot','18309513');">iphone开发<em>(65)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/18083009" id="foot_aritcle_18083009undefined8346409481018782" target="_blank" title="iOS项目的目录结构和开发流程">iOS项目的目录结构和开发流程</a><span>2014-01-10</span><label><i>阅读</i><b>1726</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/12514995" id="foot_aritcle_12514995undefined8623727131634951" target="_blank" title="关于无法接收消息推送问题的修改">关于无法接收消息推送问题的修改</a><span>2013-10-09</span><label><i>阅读</i><b>9117</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8620716" id="foot_aritcle_8620716undefined24078957526944578" target="_blank" title="ios图片处理">ios图片处理</a><span>2013-02-28</span><label><i>阅读</i><b>1331</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7911988" id="foot_aritcle_7911988undefined5979590916540474" target="_blank" title="让UISearchBar上英文Cancel变成中文的正确方法">让UISearchBar上英文Cancel变成中文的正确方法</a><span>2012-08-27</span><label><i>阅读</i><b>3759</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7658234" id="foot_aritcle_7658234undefined3178560328669846" target="_blank" title="iphone上的数据存储,sqlite3---第三方框架FMDB。">iphone上的数据存储,sqlite3---第三方框架FMDB。</a><span>2012-06-13</span><label><i>阅读</i><b>1514</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/17957469" id="foot_aritcle_17957469undefined695110694039613" target="_blank" title="ios7开发中的一些汇总(持续更新中。。。)">ios7开发中的一些汇总(持续更新中。。。)</a><span>2014-01-07</span><label><i>阅读</i><b>1522</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8678257" id="foot_aritcle_8678257undefined6452032546512783" target="_blank" title="iphone聊天用几种图形(表情)与文字混排的实现与比较">iphone聊天用几种图形(表情)与文字混排的实现与比较</a><span>2013-03-15</span><label><i>阅读</i><b>1436</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8003882" id="foot_aritcle_8003882undefined5074683967977762" target="_blank" title="快速修改程序支持iphone5">快速修改程序支持iphone5</a><span>2012-09-21</span><label><i>阅读</i><b>2835</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7658244" id="foot_aritcle_7658244undefined10899549722671509" target="_blank" title="fmdb使用">fmdb使用</a><span>2012-06-13</span><label><i>阅读</i><b>3030</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7609051" id="foot_aritcle_7609051undefined9706964045763016" target="_blank" title="纠正网上资料的错误,loadView,viewDidLoad,viewDidUnload">纠正网上资料的错误,loadView,viewDidLoad,viewDidUnload</a><span>2012-05-28</span><label><i>阅读</i><b>1364</b></label></li> </ul>
<a href="http://blog.csdn.net/decemberd/article/category/955448" class="MoreArticle">更多文章</a></div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('955448', 'decemberd','foot','18309513');
});
</script>
</div>
<div class="article_title">
<span class="ico ico_type_Repost"></span>
<h1>
<span class="link_title"><a href="/decemberd/article/details/18309513">
IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
</a></span>
</h1>
</div>
<div class="article_manage clearfix">
<div class="article_l">
<span class="link_categories">
标签:
<a href="http://www.csdn.net/tag/%e5%a4%9a%e7%ba%bf%e7%a8%8b" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多线程</a><a href="http://www.csdn.net/tag/%e5%a4%9a%e6%a0%b8" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">多核</a><a href="http://www.csdn.net/tag/%e5%b9%b6%e5%8f%91" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">并发</a><a href="http://www.csdn.net/tag/ios" target="_blank" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_tag']);">ios</a>
</span>
</div>
<div class="article_r">
<span class="link_postdate">2014-01-15 14:03</span>
<span class="link_view" title="阅读次数">6077人阅读</span>
<span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(0)</span>
<span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('IOS多线程(NSThread,NSOperation,Grand Central Dispatch)','18309513');return false;" title="收藏" target="_blank">收藏</a></span>
<span class="link_report"> <a href="#report" onclick="javascript:report(18309513,2);return false;" title="举报">举报</a></span>
</div>
</div>
<div class="embody" style="display:none" id="embody">
<span class="embody_t">本文章已收录于:</span>
<div class="embody_c" id="lib" value="{"err":0,"msg":"ok","data":[]}"></div>
</div>
<style type="text/css">
.embody{
padding:10px 10px 10px;
margin:0 -20px;
border-bottom:solid 1px #ededed;
}
.embody_b{
margin:0 ;
padding:10px 0;
}
.embody .embody_t,.embody .embody_c{
display: inline-block;
margin-right:10px;
}
.embody_t{
font-size: 12px;
color:#999;
}
.embody_c{
font-size: 12px;
}
.embody_c img,.embody_c em{
display: inline-block;
vertical-align: middle;
}
.embody_c img{
width:30px;
height:30px;
}
.embody_c em{
margin: 0 20px 0 10px;
color:#333;
font-style: normal;
}
</style>
<script type="text/javascript">
$(function () {
try
{
var lib = eval("("+$("#lib").attr("value")+")");
var html = "";
if (lib.err == 0) {
$.each(lib.data, function (i) {
var obj = lib.data[i];
//html += '<img src="' + obj.logo + '"/>' + obj.name + " ";
html += ' <a href="' + obj.url + '" target="_blank">';
html += ' <img src="' + obj.logo + '">';
html += ' <em><b>' + obj.name + '</b></em>';
html += ' </a>';
});
if (html != "") {
setTimeout(function () {
$("#lib").html(html);
$("#embody").show();
}, 100);
}
}
} catch (err)
{ }
});
</script>
<div class="category clearfix">
<div class="category_l">
<img src="http://static.blog.csdn.net/images/category_icon.jpg">
<span>分类:</span>
</div>
<div class="category_r">
<label onclick="GetCategoryArticles('955448','decemberd','top','18309513');">
<span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">iphone开发<em>(65)</em></span>
<img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
<img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
<div class="subItem">
<div class="subItem_t"><a href="http://blog.csdn.net/decemberd/article/category/955448" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
<ul class="subItem_l" id="top_955448">
</ul>
</div>
</label>
</div>
</div>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>
<div id="article_content" class="article_content">
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>文档转自:http://www.cnblogs.com/BinShao/p/zhibin.html</strong></p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>•NSThread</strong>:</p>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–优点:NSThread 比其他两个轻量级,使用简单</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<strong>•NSOperation</strong>:</div>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
–NSOperation是面向对象的</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<span style="line-height:19px"> <span style="color:rgb(255,0,0)">- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;</span></span></p>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
•如果要更新UI界面,可以在后台线程中调用<span style="line-height:19px; color:rgb(255,0,0)">performSelectorOnMainThread</span>方法</div>
<div style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<span style="line-height:19px">•提示</span>:尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread 方法,以避免不必要的麻烦</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<div>•开启后台执行任务的方法</div>
<div> </div>
<div class="O1"> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">-(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg</span></span></div>
<div class="O1"> </div>
<div>•在后台线程中通知主线程执行任务的方法</div>
<div> </div>
<div class="O1"> <span style="line-height:19px; color:rgb(255,0,0)"> –(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;</span></div>
<div class="O1"> </div>
<div>•获取线程信息</div>
<div> </div>
<div> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">[NSThread currentThread];</span></span></div>
<div> </div>
<div>•线程休眠</div>
<div> </div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">[NSThread sleepForTimeInterval:1.0f];</span></div>
<div> </div>
<div> </div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)"> + (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;</span></div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)"> - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;</span></div>
<div>
<div>•detachNewThreadSelector方法会直接启动线程方法</div>
<div>•initWithTarget需要调用start方法才能够启动线程方法</div>
</div>
<div>•参数说明:</div>
<div class="O1"> –selector:线程执行的方法,只能有一个参数,不能有返回值</div>
<div class="O1"> –target:selector消息发送的对象</div>
<div class="O1"> –argument:传输给target的唯一参数,也可以是nil</div>
<div class="O1"> </div>
<div class="O1">
<div>•NSOperation的两个子类</div>
<div class="O1"> 1.NSInvocationOperation</div>
<div class="O1"> 2.NSBlockOperation</div>
<div>•工作原理:</div>
<div class="O1"> 1.用NSOperation封装要执行的操作</div>
<div class="O1"> 2.将创建好的NSOperation对象放NSOperationQueue中</div>
<div class="O1"> 3.启动OperationQueue开始新的线程执行队列中的操作</div>
<div>•注意事项:</div>
<div class="O1"> 1.使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢</div>
<div class="O1"> 2.使用以下方法可以控制并发的线程数量:</div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)">-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;</span></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:19px; color:rgb(255,0,0)">NSInvocation/NSBlockOperation演练</span></div>
<div class="O1"><span style="line-height:19px"><img src="http://images.cnitblog.com/blog/594870/201312/27213224-c704efb7ea8041059aafd52be616684e.png" alt="" style="border:0px"></span></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1">通过<span style="line-height:19px; color:rgb(255,0,0)">addDependency</span>建立线程之间的联系 / 限制线程数量</div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213341-b47c1ee80a6f44d880a002e9ec5e4398.png" alt="" style="border:0px"></div>
<div class="O1">
<div class="O1">
<div class="O1">
<div class="O1">
<div>•GCD队列:</div>
<div>
<div class="O1"> –Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术</div>
<div class="O1"> –GCD是基于C语言的</div>
</div>
<div>
<div>GCD的优点:</div>
<div class="O1"> –充分利用多核</div>
<div class="O1"> –所有的多线程代码集中在一起,便于维护</div>
<div class="O1"> –GCD中无需使用@autoreleasepool</div>
<div class="O1"> -如果要顺序执行,可以使用dispatch_sync同步方法</div>
<div class="O1"> -dispatch_async无法确定任务的执行顺序</div>
<div class="O1"> </div>
</div>
<div class="O1">1.全局队列:所有添加到主队列中的任务都是并发执行的</div>
<div class="O1">
<div> •全局队列(可能会开启多条线程)</div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);</span></div>
</div>
<div class="O1">2.串行队列:所有添加到串行队列中的任务都是顺序执行的</div>
<div class="O1">
<div><span style="line-height:19px"> •串行队列(只可能会开启一条线程)</span></div>
<div> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);</span></div>
</div>
<div class="O1">3.主队列:所有添加到主队列中的任务都是在主线程中执行的</div>
<div class="O1">
<div><span style="line-height:19px"> •主队列</span></div>
<div> <span style="line-height:19px; color:rgb(255,0,0)"> dispatch_get_main_queue();</span></div>
</div>
</div>
</div>
</div>
<p style="margin:10px auto"> •异步操作</p>
<p style="margin:10px auto"> –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_async</span> 在其他线程执行任务,会开启新的线程</p>
<p style="margin:10px auto"> –异步方法无法确定任务的执行顺序 </p>
<div>•同步操作</div>
<p style="margin:10px auto"> –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_sync</span> 在当前在当前线程执行任务,不开启新的线程</p>
<div class="O1"> –同步操作与队列无关</div>
<div class="O1"> </div>
<div class="O1"> –同步方法会依次执行,能够决定任务的执行顺序</div>
<div class="O1"> </div>
<div class="O1"> –更新界面UI时,最好使用同步方法</div>
<p style="margin:10px auto"><span style="line-height:19px">GCD</span>就是为了在<span style="line-height:19px">“</span>多核<span style="line-height:19px">”</span>上使用多线程技术</p>
<p style="margin:10px auto"> 1> <span style="line-height:19px">要使用</span>GCD<span style="line-height:19px">,所有的方法都是</span><span style="line-height:19px; color:rgb(255,0,0)">dispatch</span><span style="line-height:19px">开头的</span></p>
<p style="margin:10px auto"> 2> <span style="line-height:19px">名词解释</span></p>
<p style="margin:10px auto"> global <span style="line-height:19px">全局</span></p>
<p style="margin:10px auto"> queue 队列</p>
<p style="margin:10px auto"> async 异步</p>
<p style="margin:10px auto"> sync <span style="line-height:19px">同步</span> </p>
<p style="margin:10px auto"><span style="line-height:19px"> 3> </span>要执行异步的任务,就在全局队列中执行即可</p>
<p style="margin:10px auto"> dispatch_async 异步执行控制不住先后顺序</p>
<p style="margin:10px auto"> 4> <span style="line-height:19px">关于</span>GCD<span style="line-height:19px">的队列</span></p>
<p style="margin:10px auto"> 全局队列 <span style="line-height:19px; color:rgb(255,0,0)">dispatch_get_global_queue</span></p>
<p style="margin:10px auto"> <span style="line-height:19px">参数:优先级</span> <span style="line-height:19px; color:rgb(255,0,0)">DISPATCH_QUEUE_PRIORITY_DEFAULT</span></p>
<p style="margin:10px auto"> <span style="line-height:19px">始终是</span> 0</p>
<p style="margin:10px auto"> <span style="line-height:19px">串行队列</span> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);</span></span></p>
<p style="margin:10px auto"><span style="line-height:19px"> </span>是创建得到的,不能直接获取</p>
<p style="margin:10px auto"> <span style="line-height:19px">主队列</span> <span style="line-height:19px; color:rgb(255,0,0)">dispatch_get_main_queue</span></p>
<p style="margin:10px auto"><span style="line-height:19px"> 5> </span>异步和同步与方法名无关,与运行所在的队列有关!</p>
<p style="margin:10px auto"><span style="line-height:19px"> </span>提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!同步主要用来控制方法的被调用的顺序</p>
<div class="O1">
<div class="O1">
<div class="O1"> </div>
<div class="O1"><span style="line-height:19px"><img src="http://images.cnitblog.com/blog/594870/201312/27213509-11cf84778c934be3b2dc97de5857716a.png" alt="" style="border:0px; width:729px"></span></div>
</div>
</div>
</div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213624-39262600d65e4221b659fd8415ca9343.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213654-3b32def361854624b81e4284adc7425d.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px"><strong>---------------------线程锁-------------------</strong></span></div>
<div class="O1"> </div>
<div class="O1"><strong><img src="http://images.cnitblog.com/blog/594870/201312/27213735-3a13c6bf125540639d785eed470ec250.png" alt="" style="border:0px"></strong></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px"><strong>---------------------通过NSBlockOperation内存缓存-------------------</strong></span></div>
<div class="O1"> </div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213833-0421fc535159469c9dbcb5e5c5cef379.png" alt="" style="border:0px; width:729px"></div>
<div class="O1"> </div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px">---------------------内存管理-------------------</span></div>
<div class="O1"> </div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213852-7121e21e915448cbaa778e56dd949c37.png" alt="" style="border:0px"></div>
<div class="O1"> </div>
<div class="O1"> </div>
</div>
</div>
</div>
<!-- Baidu Button BEGIN -->
<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1477380549130">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->
<link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">
<!--172.16.140.14-->
<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=410384"></script>
<script type="text/javascript">
document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->
<div id="digg" articleid="18309513">
<dl id="btnDigg" class="digg digg_enable" onclick="btndigga();">
<dt>顶</dt>
<dd>0</dd>
</dl>
<dl id="btnBury" class="digg digg_enable" onclick="btnburya();">
<dt>踩</dt>
<dd>0</dd>
</dl>
</div>
<div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank"> </a> </div>
<div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank"> </a></div>
<script type="text/javascript">
function btndigga() {
$(".tracking-ad[data-mod='popu_222'] a").click();
}
function btnburya() {
$(".tracking-ad[data-mod='popu_223'] a").click();
}
</script>
<ul class="article_next_prev">
<li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/decemberd/article/details/18083009';">上一篇</span><a href="/decemberd/article/details/18083009" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">iOS项目的目录结构和开发流程</a></li>
</ul>
<div style="clear:both; height:10px;"></div>
<div class="similar_article" style="">
<h4>我的同类文章</h4>
<div class="similar_c" style="margin:20px 0px 0px 0px">
<div class="similar_c_t">
<label class="similar_cur">
<span style="cursor:pointer" onclick="GetCategoryArticles('955448','decemberd','foot','18309513');">iphone开发<em>(65)</em></span>
</label>
</div>
<div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
<a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
<ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/18083009" id="foot_aritcle_18083009undefined8346409481018782" target="_blank" title="iOS项目的目录结构和开发流程">iOS项目的目录结构和开发流程</a><span>2014-01-10</span><label><i>阅读</i><b>1726</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/12514995" id="foot_aritcle_12514995undefined8623727131634951" target="_blank" title="关于无法接收消息推送问题的修改">关于无法接收消息推送问题的修改</a><span>2013-10-09</span><label><i>阅读</i><b>9117</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8620716" id="foot_aritcle_8620716undefined24078957526944578" target="_blank" title="ios图片处理">ios图片处理</a><span>2013-02-28</span><label><i>阅读</i><b>1331</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7911988" id="foot_aritcle_7911988undefined5979590916540474" target="_blank" title="让UISearchBar上英文Cancel变成中文的正确方法">让UISearchBar上英文Cancel变成中文的正确方法</a><span>2012-08-27</span><label><i>阅读</i><b>3759</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7658234" id="foot_aritcle_7658234undefined3178560328669846" target="_blank" title="iphone上的数据存储,sqlite3---第三方框架FMDB。">iphone上的数据存储,sqlite3---第三方框架FMDB。</a><span>2012-06-13</span><label><i>阅读</i><b>1514</b></label></li> </ul>
<ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/17957469" id="foot_aritcle_17957469undefined695110694039613" target="_blank" title="ios7开发中的一些汇总(持续更新中。。。)">ios7开发中的一些汇总(持续更新中。。。)</a><span>2014-01-07</span><label><i>阅读</i><b>1522</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8678257" id="foot_aritcle_8678257undefined6452032546512783" target="_blank" title="iphone聊天用几种图形(表情)与文字混排的实现与比较">iphone聊天用几种图形(表情)与文字混排的实现与比较</a><span>2013-03-15</span><label><i>阅读</i><b>1436</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/8003882" id="foot_aritcle_8003882undefined5074683967977762" target="_blank" title="快速修改程序支持iphone5">快速修改程序支持iphone5</a><span>2012-09-21</span><label><i>阅读</i><b>2835</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7658244" id="foot_aritcle_7658244undefined10899549722671509" target="_blank" title="fmdb使用">fmdb使用</a><span>2012-06-13</span><label><i>阅读</i><b>3030</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/decemberd/article/details/7609051" id="foot_aritcle_7609051undefined9706964045763016" target="_blank" title="纠正网上资料的错误,loadView,viewDidLoad,viewDidUnload">纠正网上资料的错误,loadView,viewDidLoad,viewDidUnload</a><span>2012-05-28</span><label><i>阅读</i><b>1364</b></label></li> </ul>
<a href="http://blog.csdn.net/decemberd/article/category/955448" class="MoreArticle">更多文章</a></div>
</div>
</div>
<script type="text/javascript">
$(function () {
GetCategoryArticles('955448', 'decemberd','foot','18309513');
});
</script>
</div>
0 0
- IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
- IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
- IOS多线程编程之三种实现方式NSThread、NSOperation、Grand Central Dispatch
- iOS三种多线程技术NSThread,NSOperation/NSOperationQueue,GCD-Grand Central Dispatch
- IOS多线程GCD(Grand central Dispatch)
- ios多线程之GCD(Grand Central Dispatch)
- iOS 多线程Grand Central Dispatch(GCD)
- iOS多线程(Grand Central Dispatch)
- iOS并发编程NSThread、Grand Central Dispatch、Operation Queue
- 1.NSThread 2.Cocoa NSOperation 3.GCD(Grand Central Dispatch)
- iOS Grand Central Dispatch(GCD)
- IOS GCD ---- Grand Central Dispatch
- <iOS>Grand Central Dispatch简介
- iOS多线程编程之Grand Central Dispatch(GCD)
- iOS多线程之Grand Central Dispatch 简称(GCD)
- iOS多线程开发(五)---GCD(Grand Central Dispatch)
- iOS多线程编程(三)Grand Central Dispatch(GCD)详解
- iOS多线程系列(3)GCD(Grand Central Dispatch)
- C++ — 继承
- 设计模式(六)外观模式
- Formating string in python
- MySQL中的备份和恢复
- Interlocked系列函数
- IOS多线程(NSThread,NSOperation,Grand Central Dispatch)
- 中国的支付清算体系是怎么玩的?
- mingw msys1.0 vs2013 ffmpeg debug
- mysql命令大全
- sfr与sbit的理解,及单片机中断
- 文件夹拷贝SHFileOperation
- iOS 实时搜索总结
- git格式的diff输出内容含义
- 【Android自定义View实战】之自定义圆形头像CircleImageView支持加载网络图片