OC学习笔记11--protocol使用方法及注意事项

来源:互联网 发布:html5动画源码 编辑:程序博客网 时间:2024/06/05 03:53
#import <Foundation/Foundation.h>// ProtocolA comply with root protocol@protocol ProtocolA <NSObject>// 返回值为遵守了ProtocolA的对象- (NSObject<ProtocolA> *)getSelf;@end// ProtocolB comply with ProtocolA@protocol ProtocolB <ProtocolA>@required  // 以下方法需要实现+ (id)getSelfClass;- (Class)getSelfClass;@end@protocol ProtocolC <NSObject>@optional  // 以下方法选择性实现- (void)methodC;@end// ClassA comply with ProtocolB and ProtocolC@interface ClassA :NSObject <ProtocolB,ProtocolC>// _obj成员限定指向实现了ProtocolB的对象@property(nonatomic,strong) NSObject<ProtocolB> *obj;@end@implementation ClassA+(id)getSelfClass{return self;}- (NSObject<ProtocolA> *)getSelf{return self;}- (Class)getSelfClass{return [self class];}@endint main(){ClassA<ProtocolB> *a=[[ClassA alloc] init];// a2限定指向实现了 ProtocolA 的对象id<ProtocolA> a2=[[ClassA alloc] init];[a setObj:a2];NSLog(@"a=%@,aClass=%@,a2Class=%@",[a getSelf],[a getSelfClass],[[a2 class] getSelfClass]);return 0;}



protocol: 
概念:
用来声明方法(也只能声明方法),遵守了该协议的 类或其他协议 就拥有这些方法的声明;
类似java中的interface,但是由于OC是弱类型语言(java为强类型),
许多类型上的不匹配都只是warning;
protocol与 (java中)interface 区别:
1>interface类型变量只能指向 实现了该interface的对象,
而protocol本身不是类型,无法用于声明变量;
这种多态的特征在OC中则表现为 指定了protocol 的变量
限定指向 遵守了该protocol的对象(OC中此类规则违反仅仅警告),
例:id<ProtocolA> p=[[ClassA alloc] init];(ClassA遵守了ProtocolA)
2>遵守了protocol却没实现当中方法只是警告,interface中是编译错误


声明protocol:
//NSObject为基协议,与基类NSObject同名,但不同,
//基类 NSObject 遵守了 基协议 NSObject
//与类都继承基类一样,官方建议 协议都遵守基协议
@protocol ProtocolA <NSObject>
//协议中声明的方法可以规定为须实现或可选,默认为 required
@required   // 此后声明的方法都为required,遵守该协议的类中不实现就会警告
- (id<ProtocolA>)methodA:NSObject<ProtocolA> *obj;
- (void)methodB;

@optional  // 此后声明的方法都为optional,遵守该协议的类中不实现不会警告
- (id)methodC:ClassA<ProtocolB> obj;
- (void)methodD;
@end

类遵守protocol:
// OC类是单继承,但可以遵守多个协议
@interface ClassA :NSObject <ProtocolA,ProtocolB> 
@end

@implementation ClassA
//这里实现协议中的方法
@end


使用规范:
为了提高编译效率,.h一般不import协议,用@protocol ProtocolA,ProtocolB; 这种
方式来告诉编译器ProtocolA与ProtocolB是协议,而在.m中再import,
与@class ClassA,ClassB; 方式一样;

0 0
原创粉丝点击