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="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></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 + "&nbsp;&nbsp;";
                        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">
&nbsp;</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">
&nbsp;  –不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
&nbsp;  –NSOperation是面向对象的</p>
<p style="margin:10px auto; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
&nbsp;<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">
&nbsp;</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">
&nbsp;</div>
<div class="O1" style="font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; font-size:13px; line-height:20.796875px">
<div>•开启后台执行任务的方法</div>
<div>&nbsp;</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">&nbsp;</div>
<div>•在后台线程中通知主线程执行任务的方法</div>
<div>&nbsp;</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">&nbsp;</div>
<div>•获取线程信息</div>
<div>&nbsp;</div>
<div> <span style="line-height:19px"> <span style="color:rgb(255,0,0)">[NSThread currentThread];</span></span></div>
<div>&nbsp;</div>
<div>•线程休眠</div>
<div>&nbsp;</div>
<div>  <span style="line-height:19px; color:rgb(255,0,0)">[NSThread sleepForTimeInterval:1.0f];</span></div>
<div>&nbsp;</div>
<div>&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</div>
<div class="O1">&nbsp;</div>
<div class="O1">通过<span style="line-height:19px; color:rgb(255,0,0)">addDependency</span>建立线程之间的联系 /&nbsp;限制线程数量</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">&nbsp;</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">&nbsp;•异步操作</p>
<p style="margin:10px auto">&nbsp;  –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_async</span>&nbsp;在其他线程执行任务,会开启新的线程</p>
<p style="margin:10px auto">&nbsp;  –异步方法无法确定任务的执行顺序&nbsp;</p>
<div>•同步操作</div>
<p style="margin:10px auto">&nbsp;  –<span style="line-height:19px; color:rgb(255,0,0)">dispatch_sync</span>&nbsp;在当前在当前线程执行任务,不开启新的线程</p>
<div class="O1">  –同步操作与队列无关</div>
<div class="O1">&nbsp;</div>
<div class="O1">  –同步方法会依次执行,能够决定任务的执行顺序</div>
<div class="O1">&nbsp;</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">&nbsp;&nbsp; &nbsp; 1&gt;&nbsp;<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">&nbsp;&nbsp; &nbsp; 2&gt;&nbsp;<span style="line-height:19px">名词解释</span></p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp; global&nbsp;&nbsp;<span style="line-height:19px">全局</span></p>
<p style="margin:10px auto">&nbsp; &nbsp; &nbsp;queue &nbsp; 队列</p>
<p style="margin:10px auto">&nbsp; &nbsp; &nbsp;async &nbsp; 异步</p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp; sync&nbsp; &nbsp;&nbsp;<span style="line-height:19px">同步</span>&nbsp;</p>
<p style="margin:10px auto"><span style="line-height:19px">&nbsp;&nbsp; &nbsp; 3&gt;&nbsp;</span>要执行异步的任务,就在全局队列中执行即可</p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp; &nbsp;dispatch_async 异步执行控制不住先后顺序</p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp; 4&gt;&nbsp;<span style="line-height:19px">关于</span>GCD<span style="line-height:19px">的队列</span></p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp; &nbsp;全局队列&nbsp; &nbsp;&nbsp;<span style="line-height:19px; color:rgb(255,0,0)">dispatch_get_global_queue</span></p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp;&nbsp;<span style="line-height:19px">参数:优先级</span>&nbsp;<span style="line-height:19px; color:rgb(255,0,0)">DISPATCH_QUEUE_PRIORITY_DEFAULT</span></p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp;&nbsp;<span style="line-height:19px">始终是</span>&nbsp;0</p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp;&nbsp;<span style="line-height:19px">串行队列</span>&nbsp; &nbsp;<span style="line-height:19px">&nbsp;<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">&nbsp;&nbsp; &nbsp;&nbsp;</span>是创建得到的,不能直接获取</p>
<p style="margin:10px auto">&nbsp;&nbsp; &nbsp;&nbsp;<span style="line-height:19px">主队列</span>&nbsp; &nbsp; &nbsp;&nbsp;<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">&nbsp; &nbsp; &nbsp;5&gt;&nbsp;</span>异步和同步与方法名无关,与运行所在的队列有关!</p>
<p style="margin:10px auto"><span style="line-height:19px">&nbsp;&nbsp; &nbsp;&nbsp;</span>提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!同步主要用来控制方法的被调用的顺序</p>
<div class="O1">
<div class="O1">
<div class="O1">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px"><strong>---------------------线程锁-------------------</strong></span></div>
<div class="O1">&nbsp;</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">&nbsp;</div>
<div class="O1">&nbsp;</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">&nbsp;</div>
<div class="O1">&nbsp;</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">&nbsp;</div>
<div class="O1"><span style="line-height:27px; color:rgb(255,0,0); font-size:18px">---------------------内存管理-------------------</span></div>
<div class="O1">&nbsp;</div>
<div class="O1"><img src="http://images.cnitblog.com/blog/594870/201312/27213852-7121e21e915448cbaa778e56dd949c37.png" alt="" style="border:0px"></div>
<div class="O1">&nbsp;</div>
<div class="O1">&nbsp;</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&amp;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">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</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