您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-OC语言协议Protocol

2015-03-15 11:22 211 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.概念

1>协议(Protoco)是一系列方法的列表,其声明的方法可以被任何类实现,一般称为代理模式。

2>在.h文件中@protocol声明存在协议,跟@class一样

2.作用:

1>可以声明很多方法,但是不能声明成员变量。

2>如果某个类遵守了某个协议,则这个类拥有协议中的所有方法声明。

3>如果父类遵守了某个协议,则子类也遵守了这个协议,

3.基本语法

1>定义协议

// 定义一个协议,协议名称是myprotocol,NSObject是基协议,每个协议必须遵守

[objc] view
plaincopy

@protocol myprotoco <NSObject>

- (void)test; // 声明test方法

- (void)test2; // 声明test2方法

@end

2>协议关键词

@required:要求方法必须实现,比实现就会发出警告,默认此

@optional: 不要求一定实现

eg:

[objc] view
plaincopy

@protocol myprotoco

@required

- (void)test; // 声明@required类型test方法,且要求此方法必须实现

@optional

- (void)test2; // 声明@optional类型test2方法,不一定要求此方法实现

@end

3>如何遵守协议
(1)类遵守协议

@interface 类名:父类名 <协议名称1,协议名称2>

@end
eg:

[objc] view
plaincopy

@interface

Person : NSObject <protocol1,procotol2 >

@end

(2)协议遵守协议。

@protocol 协议名 <协议1,协议2>

@end

4.基协议

(1)NSOBject是基协议,最根本最基本的协议。

(2)建议每个新协议都遵守基协议NSObject协议。

5.限制这个对象遵守协议

类名<协议名称> *变量名; eg:NSObject<myprotocol> *obj; // obj对象遵守myprotocol协议

id<协议名称> 变量名; eg:id<myprotocol> obj2;
eg:

[objc] view
plaincopy

NSObject<myprotocol> *obj2 = [[Person alloc] init];

// 等号右边的Person类也必须遵守此协议,在Person类中需指定遵守此协议</span>

6.@property中声明的属性遵守协议

@property (nonatomic,strong) 类名<协议名称> *属性名
eg:

[objc] view
plaincopy

@property(nonatomic,strong) Person<myprotocol> *p; // p属性遵守myprotocol这个协议</span>

@property (nonatomic,strong) id<协议名称> 属性名

6.协议可定义在单独的.h文件中,也可定义在某个类的.h文件中

(1)如果这个协议只能用于某个类,则此协议定义在此类的.h文件中
eg:如果myprotocol1协议只用能在Person类中,则此 协议需要定义在Person类的.h文件中

(2)如果这个协议需要多个类使用,则此协议定义在单独的.h文件中
eg:如果myprotocol1协议要被多个类同时使用,则需要将此协议单独定义在协议的.h

7.分类可定义在单独.h和.m文件中,也可定义在原来类中

(1)一般定义在单独.h和.m文件中

(2)定义在原来类中的分类,只要求能看懂语法

8.代理设计模式
定义:为其它对象提供一种代理以用来控制这个对象,我们不关心代理如何完成的,只关心代理有没有完成。
eg: 小明不想做饭,因此请了个保姆,但是请保姆需要签一份协议,保姆需要遵守协议。所以保姆就是代理,代理需要遵守某个协议。
条件:如果要成为代理,则必须遵守某个协议(协议用于声明方法,限制代理必须拥有某个方法)。
作用:可以监听某个方法是否被触发。

优点:耦合性较低,增加了代码的弹性。
eg:代理被删除了,但是Person还在。代理和对象之间互不影响。

9.总结
可以在某个文件中声明很多方法,方便多个类调用。
例如如果有很多类都需要某个方法,这样的话这些类都可以遵守这个协议,就不需要在每个类中编写相同的方法。提高了程序编写效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: