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

	
#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];
}

@end

int 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; 方式一样;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值