﻿<?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-JAVA-随笔分类-iphone IOS 开发</title><link>http://www.blogjava.net/zzzlyr/category/52818.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Oct 2012 05:58:50 GMT</lastBuildDate><pubDate>Wed, 17 Oct 2012 05:58:50 GMT</pubDate><ttl>60</ttl><item><title>Objective-C——消息、Category和Protocol</title><link>http://www.blogjava.net/zzzlyr/archive/2012/10/17/389724.html</link><dc:creator>张钊钊</dc:creator><author>张钊钊</author><pubDate>Wed, 17 Oct 2012 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/zzzlyr/archive/2012/10/17/389724.html</guid><wfw:comment>http://www.blogjava.net/zzzlyr/comments/389724.html</wfw:comment><comments>http://www.blogjava.net/zzzlyr/archive/2012/10/17/389724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzzlyr/comments/commentRss/389724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzzlyr/services/trackbacks/389724.html</trackback:ping><description><![CDATA[<p>想从JAVA转到obj-c，看了些基础的东西，感觉很奇怪，可能不太习惯，在网上看到一个不错文章有助理解obj-c的一些核心机制。<br /><br /></p>
<div id="wrapper">
<div id="content">
<div id="post" class="post">
<h2><a id="ctl01_lnkTitle" href="http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html">Objective-C&#8212;&#8212;消息、Category和Protocol</a></h2><small>2012-06-22 20:13 by 池建强, 2627 阅读, <span id="post-comment-count">11</span> 评论, <a onclick="PutInWz();return false;" href="http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html#">收藏</a>, <a id="ctl01_lnkEdit" href="http://www.cnblogs.com/chijianqiang/admin/EditPosts.aspx?postid=2558343">编辑</a></small> 
<div class="entry">
<div id="cnblogs_post_body">
<p><span style="font-family: 宋体"></span></p>
<div><span style="font-family: 宋体; font-size: 16px">面向对象永远是个可以吐槽的话题，从开始提出到推崇备至，到充满质疑，一路走来让人唏嘘不已。面向对象的思想可谓历史悠久，20世纪70年代的Smalltalk可以说是面向对象语言的经典，直到今天我们依然将这门语言视为面向对象语言的基础。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">面向对象是大部分编程语言的基本特性，像 C++、Java、Objective-C这样的静态语言，Ruby、Python这样的动态语言都是面向对象的语言。但是如何编写面向对象的程序却一直是困扰人们的话题，即使是Smalltalk，也有人认为这是一个有缺陷的面向对象的语言实现。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">我在2010年翻译过的一篇InfoQ的文章，《<a href="http://www.infoq.com/cn/news/2010/07/objects-smalltalk-erlang">面向对象编程&#9472;&#9472;走错了路</a>》中提到，面向对象编程的三个原则是：基于消息传递机制，对象分离和多态。文章中还举了Erlang例子，认为Erlang具备了这些原则，&#8220;所以可能是唯一的面向对象语言&#8221;。除了之前提到的三个特征，单继承和动态类型也被引用为面向对象语言的&#8220;绝对需求&#8221;。基于这些考虑，文章指出，Smalltalk在实现对象思想时的&#8220;错误&#8221;&#9472;&#9472;例如，只关注状态和行为，在类和基于映像的语言里缺乏良好的并发模型和消息机制。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">这篇文章中的核心就是，面向对象思想中除了对象的状态、行为，还应该关注其并发机制、消息机制，后者更为重要。这一点事实上是我在接触了Objective-C之后才有了更深入的体会。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">Ojbective-C的语法设计主要基于Smalltalk，除了提供传统的面向对象编程特性之外，还增加了很多类似动态语言Ruby、Python才具有的特性，例如动态类型、动态加载、动态绑定等等，同时强化了消息传递机制和表意（Intention Revealing Interface）接口的概念。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 18pt">&#8212;消息&#8212;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">消息传递模型（Message Passing）是Objective-C语言的核心机制。在Objective-C中，没有方法调用这种说法，只有消息传递。在C++或Java中调用某个类的方法，在Objective-C中是给该类发送一个消息。在C++或Java里，类与类的行为方法之间的关系非常紧密，一个方法必定属于一个类，且于编译时就已经绑定在一起，所以你不可能调用一个类里没有的方法。而在Objective-C中就比较简单了，类和消息之间是松耦合的，方法调用只是向某个类发送一个消息，该类可以在运行时再确定怎么处理接受到的消息。也就是说，一个类不保证一定会响应接收到的消息，如果收到了一个无法处理的消息，那么程序就是简单报一个错。甚至你可以向一个值为nil的空对象发送消息，系统都不会出错或宕掉。这种设计本身也比较符合软件的隐喻。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">在表意接口（Intention Revealing Interface）方面，Objective-C也是设计的比较出色的语言。面向对象语言的特性之一就是通过API把实现封装起来，为上层建筑提供服务。但是需要注意的一点就是，你封装的API最好能够让调用者看到接口描述就知道怎么使用。如果为了使用一个API必须要去研究它的实现，那么就失去了封装的意义。Objective-C通过显式的API描述，让开发者不自觉的写出满足表意接口的API，比如下图中的API描述。</span></div>
<div>
<p><span style="font-family: 宋体; font-size: 16px"><img alt="" src="http://pic002.cnblogs.com/images/2012/292351/2012062123321244.jpg" /></span></p></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px"></span>
<div><span style="font-family: 宋体; font-size: 16px">上图中描述了一个传统意义的实例方法，但和Java或C++不同的是，其方法关键字由多个字符串组成，在这个例子是insertObject和atIndex，(id)anObject和 (NSUInterger)index分别表示参数类型和参数名称。整个方法看上去就像一个英语句子，我们可以很容易的知道，这个方法就是在索引为 index处插入一个对象。如果你是从其他语言转到Objective-C，那么开始的时候会感觉这种写法有些繁复，但是一旦理解并习惯了你会感受到其巨大的好处，这种写法会强制你写出优美易读的代码和API，而且有了XCode强大的提示功能，再长的方法也是一蹴而就。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div>
<div><span style="font-family: 宋体; font-size: 16px">下面我们来说说多态和继承。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;与Java一样，Objective-C一样不支持多重继承，但是通过类别（Category）和协议（Protocol）可以很好的实现代码复用和扩展。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 18pt">&#8212;Category&#8212;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">首先我们来谈谈Category。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">Objective-C提供了一种与众不同的方式&#8212;&#8212;Catagory，可以动态的为已经存在的类添加新的行为。这样可以保证类的原始设计规模较小，功能增加时再逐步扩展。使用Category 对类进行扩展时，不需要访问其源代码，也不需要创建子类。Category使用简单的方式，实现了类的相关方法的模块化，把不同的类方法分配到不同的分类文件中。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">实现起来很简单，我们举例说明。</span></div>
<div>
<div class="cnblogs_code"><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #000000">SomeClass.h
</span><span style="color: #0000ff">@interface</span></font><font face="宋体"><span style="color: #000000"> SomeClass : NSObject{
}
</span>-(<span style="color: #0000ff">void</span></font><font face="宋体"><span style="color: #000000">) print;
</span><span style="color: #0000ff">@end</span>&nbsp;</font></span></pre></div></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">这是类SomeClass的声明文件，其中包含一个实例方法print。如果我们想在不修改原始类、不增加子类的情况下，为该类增加一个hello的方法，只需要简单的定义两个文件 SomeClass+Hello.h和SomeClass+Hello.m，在声明文件和实现文件中用&#8220;()&#8221;把Category的名称括起来即可。声明文件代码如下：</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div class="cnblogs_code"><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #0000ff">#import</span> <span style="color: #800000">"</span><span style="color: #800000">SomeClass.h</span><span style="color: #800000">"</span>
 
<span style="color: #0000ff">@interface</span><span style="color: #000000"> SomeClass (Hello)</span>
-(<span style="color: #0000ff">void</span><span style="color: #000000">)hello;</span>
<span style="color: #0000ff">@end</span></font></span></pre></div>
<div><span style="font-family: 宋体; font-size: 16px">实现文件代码如下</span></div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #0000ff">#import</span> <span style="color: #800000">"</span><span style="color: #800000">SomeClass+Hello.h</span><span style="color: #800000">"</span></font><span style="color: #000000">
<font face="宋体">@implementationSomeClass (Hello)
</font></span>-(<span style="color: #0000ff"><font face="宋体">void</font></span><font face="宋体"><span style="color: #000000">)hello{
    NSLog (</span><span style="color: #800000">@"</span><span style="color: #800000">name：%@ </span><span style="color: #800000">"</span>, <span style="color: #800000">@"</span><span style="color: #800000">Jacky</span><span style="color: #800000">"</span></font><font face="宋体"><span style="color: #000000">);
}
</span><span style="color: #0000ff">@end</span>&nbsp;</font></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div></div>
<div><span style="font-family: 宋体; font-size: 16px">其中Hello是Category的名称，如果你用XCode创建Category，那么需要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯，将声明文件和实现文件名称统一采用&#8220;原类名+Category&#8221;的方式命名。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">调用也非常简单，毫无压力，如下：</span></div>
<div><span style="font-family: 宋体; font-size: 16px">首先引入Category的声明文件，然后正常调用即可。</span></div>
<div>
<div class="cnblogs_code"><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #0000ff">#import</span> <span style="color: #800000">"</span><span style="color: #800000">SomeClass+Hello.h</span><span style="color: #800000">"</span></font><span style="color: #000000">
<font face="宋体"> 
SomeClass </font></span>* sc =<font face="宋体"><span style="color: #000000">[[SomeClass alloc] init];
[sc hello]</span>&nbsp;</font></span></pre></div></div>
<div><span style="font-family: 宋体; font-size: 16px">执行结果是：</span></div>
<div><span style="font-family: 宋体; font-size: 16px"><strong>name</strong><strong>：</strong><strong>Jacky&nbsp;</strong></span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">Category的使用场景：</span> 
<div><span style="font-family: 宋体; font-size: 16px">1、当你在定义类的时候，在某些情况下（例如需求变更），你可能想要为其中的某个或几个类中添加方法。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">2、一个类中包含了许多不同的方法需要实现，而这些方法需要不同团队的成员实现</span></div>
<div><span style="font-family: 宋体; font-size: 16px">3、当你在使用基础类库中的类时，你可能希望这些类实现一些你需要的方法。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">遇到以上这些需求，Category可以帮助你解决问题。当然，使用Category也有些问题需要注意，</span></div>
<div><span style="font-family: 宋体; font-size: 16px">1、Category可以访问原始类的实例变量，但不能添加变量，如果想添加变量，可以考虑通过继承创建子类。</span></div></div>
<div><span style="font-family: 宋体; font-size: 16px">2、Category可以重载原始类的方法，但不推荐这么做，这么做的后果是你再也不能访问原来的方法。如果确实要重载，正确的选择是创建子类。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">3、和普通接口有所区别的是，在分类的实现文件中可以不必实现所有声明的方法，只要你不去调用它。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">用好Category可以充分利用Objective-C的动态特性，编写出灵活简洁的代码。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 18pt">&#8212;Protocol&#8212;&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">下面我们再来看Protocol。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">Protocol，简单来说就是一系列不属于任何类的方法列表，其中声明的方法可以被任何类实现。这种模式一般称为代理（delegation）模式。你通过Protocol定义各种行为，在不同的场景采用不同的实现方式。在iOS和OS X开发中，Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">定义Protocol很简单，在声明文件（h文件）中通过关键字@protocol定义，然后给出Protocol的名称，方法列表，然后用@end表示Protocol结束。在@end指令结束之前定义的方法，都属于这个Protocol。例如：</span></div>
<div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #0000ff">@protocol</span> ProcessDataDelegate &lt;NSObject&gt;</font><span style="color: #000000">
<font face="宋体">@required
</font></span>- (<span style="color: #0000ff"><font face="宋体">void</font></span><font face="宋体"><span style="color: #000000">) processSuccessful: (BOOL)success;

@optional
</span>- (<span style="color: #0000ff">id</span>) submitOrder: (NSNumber *</font><font face="宋体"><span style="color: #000000">) orderid;
</span><span style="color: #0000ff">@end</span></font></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div><font face="宋体"></font></div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">以上代码可以单独放在一个h文件中，也可以写在相关类的h文件中，可以视具体情况而定。该Protocol包含两个方法，processSuccessful和submitOrder。这里还有两个关键字，@required和@optional，表示如果要实现这个协议，那么processSuccessful方法是必须要实现的，submitOrder则是可选的，这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明，那么方法默认是@required的，必须实现。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">那么如何实现这个Protocol呢，很简单，创建一个普通的Objective-C类，取名为TestAppDelegate，这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件，之后声明采用这个Protocol即可，如下：</span></div>
<div>
<div class="cnblogs_code"><pre><span style="font-family: 宋体; font-size: 16px"><font face="宋体"><span style="color: #0000ff">@interface</span> TestAppDelegate : NSObject&lt;ProcessDataDelegate&gt;</font><font face="宋体"><span style="color: #000000">;

</span><span style="color: #0000ff">@end</span></font></span></pre></div></div>
<div><span style="font-family: 宋体; font-size: 16px">用尖括号（&lt;...&gt;）括起来的ProcessDataDelegate就是我们创建的Protocol。如果要采用多个Protocol，可以在尖括号内引入多个Protocol 名称，并用逗号隔开即可。例如&lt;ProcessDataDelegate,xxxDelegate&gt;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">m文件如下：</span></div>
<div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div><pre><span style="font-family: 宋体; font-size: 16px"><span style="color: #0000ff"><font face="宋体">@implementation</font></span><font face="宋体"><span style="color: #000000"> TestAppDelegate

</span>- (<span style="color: #0000ff">void</span></font><font face="宋体"><span style="color: #000000">) processSuccessful: (BOOL)success{
    </span><span style="color: #0000ff">if</span></font><font face="宋体"><span style="color: #000000"> (success) {
        NSLog(</span><span style="color: #800000">@"</span><span style="color: #800000">成功</span><span style="color: #800000">"</span></font><font face="宋体"><span style="color: #000000">);
    }</span><span style="color: #0000ff">else</span></font><font face="宋体"><span style="color: #000000"> {
        NSLog(</span><span style="color: #800000">@"</span><span style="color: #800000">失败</span><span style="color: #800000">"</span></font><font face="宋体"><span style="color: #000000">);
    }
}

</span><span style="color: #0000ff">@end</span>&nbsp;</font></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div></div></div>
<div><span style="font-family: 宋体; font-size: 16px">由于submitOrder方法是可选的，所以我们可以只实现processSuccessful。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">Protocol一般使用在哪些场景呢？Objective-C里的Protocol和Java语言中的接口很类似，如果一些类之间没有继承关系，但是又具备某些相同的行为，则可以使用 Protocol来描述它们的关系。不同的类，可以遵守同一个Protocol，在不同的场景下注入不同的实例，实现不同的功能。其中最常用的就是委托代理模式，Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件，都是通过委托的方式交给Controller完成。根据约定，框架中后缀为Delegate的都是Protocol，例如UIApplicationDelegate，UIWebViewDelegate 等，使用时大家可以留意一下，体会其用法。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">使用Protocol时还需要注意的是：</span></div>
<div><span style="font-family: 宋体; font-size: 16px">1、Protocol本身是可以继承的，比如：</span></div>
<div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div><pre><span style="font-family: 宋体; font-size: 16px"><span style="color: #0000ff"><font face="宋体">@protocol</font></span><font face="宋体"><span style="color: #000000"> A
     </span>-(<span style="color: #0000ff">void</span></font><font face="宋体"><span style="color: #000000">)methodA;
</span><span style="color: #0000ff">@end</span>
<span style="color: #0000ff">@protocol</span> B &lt;A&gt;
     -(<span style="color: #0000ff">void</span></font><font face="宋体"><span style="color: #000000">)methodB;
</span><span style="color: #0000ff">@end</span></font></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div></div>
<p><span style="font-family: 宋体; font-size: 16px">如果你要实现B，那么methodA和methodB都需要实现。&nbsp;</span></p></div>
<div><span style="font-family: 宋体; font-size: 16px">2、Protocol是类无关的，任何类都可以实现定义好的Protocol。如果我们想知道某个类是否实现了某个Protocol，还可以使用conformsToProtocol进行判断，如下：</span></div>
<div>
<div class="cnblogs_code"><pre><span style="font-family: 宋体; font-size: 16px">[obj conformsToProtocol:<font face="宋体"><span style="color: #0000ff">@protocol</span>(ProcessDataDelegate)]&nbsp;</font></span></pre></div></div></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">好吧，具体的语言特性这次就介绍这么多。从某种意义上来说，Objective-C是一门古老的语言，发明于1980年。1988年，乔布斯的Next公司获得了Objective-C语言的授权，并开发出了Objective-C的语言库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基础，Objective-C是其语言和运行库，后来的事大家都清楚，苹果买了Next，乔布斯回归苹果，开始神奇的苹果振兴之路，NextStep成了Max OS X的基础。以后发展越来越好，Objctive-C成了Apple的当家语言，现在基本上是Apple在维护Objctive-C的发展。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">在苹果的AppStore推出之前，Objective-C一直相对小众，但是其优秀的语言特性似乎一直在为后面的爆发积蓄力量，当苹果平台级的应用出现之后，Objective-C开始大放异彩，静态语言的效率和动态语言的特性得到众多程序员的喜爱，目前它已经以火箭般的速度蹿升TIOBE语言排行版第四位。</span></div>
<div><span style="font-family: 宋体; font-size: 16px">&nbsp;</span></div>
<div><span style="font-family: 宋体; font-size: 16px">对于喜爱苹果技术的技术人员来说，Objective-C是你必须深入了解和值得学习的一门语言，希望以后有机会多写一些相关的文章。<br /><br />转载于：<a href="http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html">http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html</a></span></div></div></div></div></div></div></div>
<p>&nbsp;</p><img src ="http://www.blogjava.net/zzzlyr/aggbug/389724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzzlyr/" target="_blank">张钊钊</a> 2012-10-17 13:49 <a href="http://www.blogjava.net/zzzlyr/archive/2012/10/17/389724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>