??xml version="1.0" encoding="utf-8" standalone="yes"?>一本一道久久a久久精品蜜桃,а√在线中文在线新版,3p在线观看http://www.aygfsteel.com/zzzlyr/archive/2012/10/17/389724.html张钊?/dc:creator>张钊?/author>Wed, 17 Oct 2012 05:49:00 GMThttp://www.aygfsteel.com/zzzlyr/archive/2012/10/17/389724.htmlhttp://www.aygfsteel.com/zzzlyr/comments/389724.htmlhttp://www.aygfsteel.com/zzzlyr/archive/2012/10/17/389724.html#Feedback0http://www.aygfsteel.com/zzzlyr/comments/commentRss/389724.htmlhttp://www.aygfsteel.com/zzzlyr/services/trackbacks/389724.html想从JAVA转到obj-cQ看了些基础的东西,感觉很奇怪,可能不太习惯Q在|上看到一个不错文章有助理解obj-c的一些核心机制?br />

Objective-C——消息、Category和Protocol

2012-06-22 20:13 by 池徏? 2627 阅读, 11 评论, 收藏, ~辑

面向对象永远是个可以吐槽的话题,从开始提出到推崇备至Q到充满质疑Q一路走来让人唏嘘不巌Ӏ面向对象的思想可谓历史悠久Q?0世纪70q代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然这门语a视ؓ面向对象语言的基?/span>
面向对象是大部分~程语言的基本特性,?C++、Java、Objective-Cq样的静态语aQRuby、Pythonq样的动态语a都是面向对象的语a。但是如何编写面向对象的E序却一直是困扰Z的话题,即是SmalltalkQ也有h认ؓq是一个有~陷的面向对象的语言实现?/span>
 
我在2010q翻译过的一InfoQ的文章,?a >面向对象~程──走错了\》中提到Q面向对象编E的三个原则是:Z消息传递机Ӟ对象分离和多态。文章中qD了Erlang例子Q认为Erlang具备了这些原则,“所以可能是唯一的面向对象语a”。除了之前提到的三个特征Q单l承和动态类型也被引用ؓ面向对象语言?#8220;l对需?#8221;。基于这些考虑Q文章指出,Smalltalk在实现对象思想时的“错误”──例如Q只x状态和行ؓQ在cdZ映像的语a里缺乏良好的q发模型和消息机制?/span>
 
q篇文章中的核心是Q面向对象思想中除了对象的状态、行为,q应该关注其q发机制、消息机Ӟ后者更为重要。这一点事实上是我在接触了Objective-C之后才有了更深入的体会?/span>
 
Ojbective-C的语法设计主要基于SmalltalkQ除了提供传l的面向对象~程Ҏ之外,q增加了很多cM动态语aRuby、Python才具有的Ҏ,例如动态类型、动态加载、动态绑定等{,同时强化了消息传递机制和表意QIntention Revealing InterfaceQ接口的概念?/span>
 
—消息—
消息传递模型(Message PassingQ是Objective-C语言的核心机制。在Objective-C中,没有Ҏ调用q种说法Q只有消息传递。在C++或Java中调用某个类的方法,在Objective-C中是l该cd送一个消息。在C++或Java里,cMcȝ行ؓҎ之间的关p非常紧密,一个方法必定属于一个类Q且于编译时已l绑定在一P所以你不可能调用一个类里没有的Ҏ。而在Objective-C中就比较单了Q类和消息之间是松耦合的,Ҏ调用只是向某个类发送一个消息,该类可以在运行时再确定怎么处理接受到的消息。也是_一个类不保证一定会响应接收到的消息Q如果收C一个无法处理的消息Q那么程序就是简单报一个错。甚至你可以向一个gؓnil的空对象发送消息,pȝ都不会出错或宕掉。这U设计本w也比较W合软g的隐喅R?/span>
 
在表意接口(Intention Revealing InterfaceQ方面,Objective-C也是设计的比较出色的语言。面向对象语a的特性之一是通过API把实现封装v来,Z层徏{提供服务。但是需要注意的一点就是,你封装的API最好能够让调用者看到接口描q就知道怎么使用。如果ؓ了用一个API必须要去研究它的实现Q那么就失去了封装的意义。Objective-C通过昑ּ的API描述Q让开发者不自觉的写出满意接口的APIQ比如下图中的API描述?/span>

 
上图中描qC一个传l意义的实例ҎQ但和Java或C++不同的是Q其Ҏ关键字由多个字符串组成,在这个例子是insertObject和atIndexQ?id)anObject?(NSUInterger)index分别表示参数cd和参数名U。整个方法看上去像一个英语句子,我们可以很容易的知道Q这个方法就是在索引?index处插入一个对象。如果你是从其他语言转到Objective-CQ那么开始的时候会感觉q种写法有些J复Q但是一旦理解ƈ习惯了你会感受到其巨大的好处Q这U写法会强制你写Z易ȝ代码和APIQ而且有了XCode强大的提C功能,再长的方法也是一y而就?/span>
 
下面我们来说说多态和l承?/span>
 与Java一PObjective-C一样不支持多重l承Q但是通过cdQCategoryQ和协议QProtocolQ可以很好的实现代码复用和扩展?/span>
 
—Category—
首先我们来谈谈Category?/span>
 
Objective-C提供了一U与众不同的方式——CatagoryQ可以动态的为已l存在的cL加新的行为。这样可以保证类的原始设计规模较,功能增加时再逐步扩展。用Category 对类q行扩展Ӟ不需要访问其源代码,也不需要创建子cRCategory使用单的方式Q实Ccȝ相关Ҏ的模块化Q把不同的类Ҏ分配C同的分类文g中?/span>
 
实现h很简单,我们举例说明?/span>
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 
 
q是cSomeClass的声明文Ӟ其中包含一个实例方法print。如果我们想在不修改原始cR不增加子类的情况下Qؓ该类增加一个hello的方法,只需要简单的定义两个文g SomeClass+Hello.h和SomeClass+Hello.mQ在声明文g和实现文件中?#8220;()”把Category的名U括h卛_。声明文件代码如下:
 
#import "SomeClass.h"
 
@interface SomeClass (Hello)
-(void)hello;
@end
实现文g代码如下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
    NSLog (@"nameQ?@ ", @"Jacky");
}
@end 
其中Hello是Category的名Uͼ如果你用XCode创徏CategoryQ那么需要填写的内容包括名称和要扩展的类的名U。这里还有一个约定成俗的习惯Q将声明文g和实现文件名U统一采用“原类?Category”的方式命名?/span>
调用也非常简单,毫无压力Q如下:
首先引入Category的声明文Ӟ然后正常调用卛_?/span>
#import "SomeClass+Hello.h"
 
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 
执行l果是:
nameQ?/strong>Jacky 
 
Category的用场景:
1、当你在定义cȝ时候,在某些情况下Q例如需求变_Q你可能惌为其中的某个或几个类中添加方法?/span>
2、一个类中包含了许多不同的方法需要实玎ͼ而这些方法需要不同团队的成员实现
3、当你在使用基础cd中的cLQ你可能希望q些cdC些你需要的Ҏ?/span>
 
遇到以上q些需求,Category可以帮助你解决问题。当Ӟ使用Category也有些问题需要注意,
1、Category可以讉K原始cȝ实例变量Q但不能d变量Q如果想d变量Q可以考虑通过l承创徏子类?/span>
2、Category可以重蝲原始cȝҎQ但不推荐这么做Q这么做的后果是你再也不能访问原来的Ҏ。如果确实要重蝲Q正的选择是创建子cR?/span>
3、和普通接口有所区别的是Q在分类的实现文件中可以不必实现所有声明的ҎQ只要你不去调用它?/span>
 
用好Category可以充分利用Objective-C的动态特性,~写出灵zȝz的代码?/span>
 
—Protocol— 
下面我们再来看Protocol?/span>
ProtocolQ简单来说就是一pd不属于Q何类的方法列表,其中声明的方法可以被Mcd现。这U模式一般称Z理(delegationQ模式。你通过Protocol定义各种行ؓQ在不同的场景采用不同的实现方式。在iOS和OS X开发中QApple采用了大量的代理模式来实现MVC中View和Controller的解耦?/span>
 
定义Protocol很简单,在声明文Ӟh文gQ中通过关键字@protocol定义Q然后给出Protocol的名UͼҎ列表Q然后用@end表示Protocoll束。在@end指ol束之前定义的方法,都属于这个Protocol。例如:
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;

@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
 
以上代码可以单独攑֜一个h文g中,也可以写在相关类的h文g中,可以视具体情况而定。该Protocol包含两个ҎQprocessSuccessful和submitOrder。这里还有两个关键字Q@required和@optionalQ表C如果要实现q个协议Q那么processSuccessfulҎ是必要实现的,submitOrder则是可选的Q这两个注解关键字是在Objective-C 2.0之后加入的语法特性。如果不注明Q那么方法默认是@required的,必须实现?/span>
 
那么如何实现q个Protocol呢,很简单,创徏一个普通的Objective-Cc,取名为TestAppDelegateQ这时会生成一个h文g和m文g。在h文g中引入包含Protocol的h文gQ之后声明采用这个Protocol卛_Q如下:
@interface TestAppDelegate : NSObject<ProcessDataDelegate>;

@end
用尖括号Q?lt;...>Q括h的ProcessDataDelegate是我们创徏的Protocol。如果要采用多个ProtocolQ可以在括号内引入多个Protocol 名称Qƈ用逗号隔开卛_。例?lt;ProcessDataDelegate,xxxDelegate>
 
m文g如下Q?/span>
@implementation TestAppDelegate

- (void) processSuccessful: (BOOL)success{
    if (success) {
        NSLog(@"成功");
    }else {
        NSLog(@"p|");
    }
}

@end 
׃submitOrderҎ是可选的Q所以我们可以只实现processSuccessful?/span>
 
Protocol一般用在哪些场景呢?Objective-C里的Protocol和Java语言中的接口很类|如果一些类之间没有l承关系Q但是又具备某些相同的行为,则可以?Protocol来描q它们的关系。不同的c,可以遵守同一个ProtocolQ在不同的场景下注入不同的实例,实现不同的功能。其中最常用的就是委托代理模式,Cocoa框架中大量采用了q种模式实现数据和UI的分R例如UIView产生的所有事Ӟ都是通过委托的方式交lController完成。根据约定,框架中后~为Delegate的都是ProtocolQ例如UIApplicationDelegateQUIWebViewDelegate {,使用时大家可以留意一下,体会其用法?/span>
 
使用Protocol时还需要注意的是:
1、Protocol本n是可以承的Q比如:
@protocol A
     -(void)methodA;
@end
@protocol B <A>
     -(void)methodB;
@end

如果你要实现BQ那么methodA和methodB都需要实现?nbsp;

2、Protocol是类无关的,Mc都可以实现定义好的Protocol。如果我们想知道某个cL否实C某个ProtocolQ还可以使用conformsToProtocolq行判断Q如下:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
 
好吧Q具体的语言Ҏ这ơ就介绍q么多。从某种意义上来_Objective-C是一门古老的语言Q发明于1980q?988q_乔布斯的Next公司获得了Objective-C语言的授权,q开发出了Objective-C的语a库和NEXTSTEP的开发环境。NextStep是以Mach和BSD为基QObjective-C是其语言和运行库Q后来的事大安清楚Q苹果买了NextQ乔布斯回归ҎQ开始神奇的Ҏ振兴之\QNextStep成了Max OS X的基。以后发展越来越好,Objctive-C成了Apple的当家语aQ现在基本上是Apple在维护Objctive-C的发展?/span>
 
在苹果的AppStore推出之前QObjective-C一直相对小众,但是其优U的语aҎ似乎一直在为后面的爆发U蓄力量Q当Ҏq_U的应用出现之后QObjective-C开始大攑ּ彩,静态语a的效率和动态语a的特性得C多程序员的喜爱,目前它已l以火箭般的速度y升TIOBE语言排行版第四位?/span>
 
对于喜爱Ҏ技术的技术h员来_Objective-C是你必须深入了解和值得学习的一门语aQ希望以后有Z多写一些相关的文章?br />
转蝲于:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html

 



]]>
վ֩ģ壺 | ľ| | | | ˮ| Ӫɽ| | Ͼ| | | | ɽ| | Ǽ| | ƾ| | | ˳| ͨ| | | | | | | | ؿ˹| Ԫ| | | ƫ| ֳ| | ɽ| ν| | | | |