基本语法 protocols Category extension

转:http://blog.csdn.net/wangeen/article/details/16989529html

protocol   本质就是一系列的method的声明,他并不像class是必须的选项,根据本身的设计模式来选择性的使用。 程序员

 protocol协议时为了补充Objective-C 只能单继承的缺陷而增长的一个新功能。Objective-C重全部的方法都是虚方法,因此在oc重也就没有关键字 virtual一说,有了协议能够补充设计模式

Objective-C单继承的缺陷,协议并非一个真正的类,在协议的里面只声明方法不实现,而且在协议当中不能声明实例变量,若是一个类实现了某一个协议的方法,那么称折各种遵框架

循(遵照,采用)了这个协议,正式的协议在类中必须被实现,一个类能够实现多个协议,一个协议也能够被多个类实现,模块化

 

Category学习

http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.htmlui

 

—Category—
首先咱们来谈谈Category。
 
Objective-C提供了一种不同凡响的方式——Category,能够动态的为已经存在的类添加新的行为。这样能够保证类的原始设计规模较小,功能增长时再逐步扩展。使用Category对类进行扩展时,不须要访问其源代码,也不须要建立子类。Category使用简单的方式,实现了类的相关方法的模块化,把不一样的类方法分配到不一样的分类文件中。
 
实现起来很简单,咱们举例说明。
SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end 
 
这是类SomeClass的声明文件,其中包含一个实例方法print。若是咱们想在不修改原始类、不增长子类的状况下,为该类增长一个hello的方法,只须要简单的定义两个文件SomeClass+Hello.h和SomeClass+Hello.m, 在声明文件和实现文件中用“()”把Category的名称括起来便可。声明文件代码以下:
 
#import "SomeClass.h"
 
@interface SomeClass (Hello)
-(void)hello;
@end
实现文件代码以下
#import "SomeClass+Hello.h"
@implementationSomeClass (Hello)
-(void)hello{
    NSLog (@"name:%@ ", @"Jacky");
}
@end 
其中Hello是Category的名称,若是你用XCode建立Category,那么须要填写的内容包括名称和要扩展的类的名称。这里还有一个约定成俗的习惯, 将声明文件和实现文件名称统一采用“原类名+Category”的方式命名。
调用也很是简单,毫无压力,以下:
首先引入Category的声明文件,而后正常调用便可。
#import "SomeClass+Hello.h"
 
SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 
执行结果是:
name:Jacky 
 
Category的使用场景:
一、当你在定义类的时候,在某些状况下(例如需求变动),你可能想要为其中的某个或几个类中添加方法。
二、一个类中包含了许多不一样的方法须要实现,而这些方法须要不一样团队的成员实现
三、当你在使用基础类库中的类时,你可能但愿这些类实现一些你须要的方法。
 
遇到以上这些需求,Category能够帮助你解决问题。固然,使用Category也有些问题须要注意,
一、Category能够访问原始类的实例变量,但不能添加变量,若是想添加变量,能够考虑经过继承建立子类。
二、Category能够重载原始类的方法,但不推荐这么作,这么作的后果是你不再能访问原来的方法。若是确实要重载,正确的选择是建立子类。
三、和普通接口有所区别的是,在分类的实现文件中能够没必要实现全部声明的方法,只要你不去调用它。
 
用好Category能够充分利用Objective-C的动态特性,编写出灵活简洁的代码。
—Protocol— 
下面咱们再来看Protocol。
Protocol,简单来讲就是一系列不属于任何类的方法列表,其中声明的方法能够被任何类实现。这种模式通常称为代理(delegation)模式。你经过Protocol定义各类行为,在不一样的场景采用不一样的实现方式。在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View和Controller的解耦。
 
定义Protocol很简单,在声明文件(h文件)中经过关键字@protocol定义,而后给出Protocol的名称,方法列表,而后用@end表示Protocol结束。在@end指令结束以前定义的方法,都属于这个Protocol。例如:
复制代码
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;

@optional
- (id) submitOrder: (NSNumber *) orderid;
@end
复制代码
 
以上代码能够单独放在一个h文件中,也能够写在相关类的h文件中,能够视具体状况而定。该Protocol包含两个方法,processSuccessful和submitOrder。这里还有两个关键字,@required和@optional,表示若是要实现这个协议,那么processSuccessful方法是必需要实现的,submitOrder则是可选的,这两个注解关键字是在Objective-C 2.0以后加入的语法特性。若是不注明,那么方法默认是@required的,必须实现。
 
那么如何实现这个Protocol呢,很简单,建立一个普通的Objective-C类,取名为TestAppDelegate,这时会生成一个h文件和m文件。在h文件中引入包含Protocol的h文件,以后声明采用这个Protocol便可,以下:
@interface TestAppDelegate : NSObject<ProcessDataDelegate>;

@end
用尖括号(<...>)括起来的ProcessDataDelegate就是咱们建立的Protocol。若是要采用多个Protocol,能够在尖括号内引入多个Protocol名称,并用逗号隔开便可。例如<ProcessDataDelegate,xxxDelegate>
 
m文件以下:
复制代码
@implementation TestAppDelegate

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

@end 
复制代码
因为submitOrder方法是可选的,因此咱们能够只实现processSuccessful。
 
Protocol通常使用在哪些场景呢?Objective-C里的Protocol和Java语言中的接口很相似,若是一些类之间没有继承关系,可是又具有某些相同的行为,则可使用Protocol来描述它们的关系。不一样的类,能够遵照同一个Protocol,在不一样的场景下注入不一样的实例,实现不一样的功能。其中最经常使用的就是委托代理模式,Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的全部事件,都是经过委托的方式交给Controller完成。根据约定,框架中后缀为Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等,使用时你们能够留意一下,体会其用法。
 
使用Protocol时还须要注意的是:
一、Protocol自己是能够继承的,好比:
@protocol A
     -(void)methodA;
@end
@protocol B <A>
     -(void)methodB;
@end

若是你要实现B,那么methodA和methodB都须要实现。 spa

二、Protocol是类无关的,任何类均可以实现定义好的Protocol。若是咱们想知道某个类是否实现了某个Protocol,还可使用conformsToProtocol进行判断,以下:
[obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
 
好吧,具体的语言特性此次就介绍这么多。从某种意义上来讲,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的发展。
 
在苹果的AppStore推出以前,Objective-C一直相对小众,可是其优秀的语言特性彷佛一直在为后面的爆发积蓄力量,当苹果平台级的应用出现以后,Objective-C开始大放异彩,静态语言的效率和动态语言的特性获得众多程序员的喜好,目前它已经以火箭般的速度蹿升TIOBE语言排行版第四位。
 
对于喜好苹果技术的技术人员来讲,Objective-C是你必须深刻了解和值得学习的一门语言,但愿之后有机会多写一些相关的文章。
 
 
Extension
extension能够 理解成匿名的category,一样须要括号。
下面就是隐藏私有实现的一个例子,也是extension一个经常使用的方式。
 
  
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

extension 经常被用来限定属性的访问权限。好比一个属性提供对外可读,可是对内要可读可写。就用extension实现。
相关文章
相关标签/搜索