协议:protocol
专门用来声明一大堆方法,不能声明属性,也不能实现方法,只能用来写方法的声明
只要某个类遵守这个协议,就相当于拥有这个协议中的所有方法声明,需要自己写实现
协议就是用来写方法声明,用来被类遵守的
/// 协议
@protocol 协议名称 <NSOject>
方法的声明;
@end
@protocol MyProtocol <NSOject>
-(void)run;
-(void)sleep;
@end
/// 使用
@interface 类名: 父类名 <协议名称,协议名称>
@end
- 不写实现协议中的方法,不会报错,编译器会警报
- 类可以单继承,协议可以多遵守
- 所有的协议都直接或者间接从
NSObject
协议继承
@required与@optional
@required
修饰的方法的声明,就必须实现,编译器会警告,默认属性
@optional
修饰的方法的声明,可以实现或者不实现,不实现编译器也不会警告
@protocol MyProtocol <NSOject>
@required
-(void)run;
@optional
-(void)sleep;
@end
协议可以继承(多继承)
@protocol A协议 <B协议>//A继承B
方法的声明;
@end
- 在
Foundation
框架中,有一个类叫做NSObject
,是所以OC类的基类 - 在
Foundation
框架中,有一个协议叫做NSObject
,基协议 NSObject
协议被NSObject
类遵守,NSObject
协议中所有方法,OC
类都有- 类的名称可以跟协议一样
协议类型的限制
声明一个指针可以指向任意对象,但是要求指向的对象要遵守指定的协议(多个协议),否则警告
NSObject<协议,协议> *obj1
id<协议,协议> obj2
NSObject<协议> *obj1 = [Student new];
id<协议> obj2 = [Student new];
代理delegate
代理的数据类型:id<协议> delegate;
代理协议写在头文件中
代理协议可以选择写在头文件中
@interface
上面,读取头文字自动读取
#import <UIKit/UIKit.h>
@class CZFooterView;
@protocol CZFooterViewDelegate<NSObject,UIScrollViewDelegate>
-(void)footerViewUpdateData:(CZFooterView *)footerView;
@end
@interface CZFooterView :UIView
@property(nonationic,weak) id<CZFooterViewDelegate> delegate;
@end
@implementation CZFooterView;
- (IBAction)btnLoadMoreClick {
// 检查代理对象的方法是否实现了
if([self.delegate respondsToSelector:@selector(footerViewUpdateData:)]) {
// 执行代理对象的方法
[self.delegate footerViewUpdateData:self];
}
}
@end
控制器
// 添加协议<CZFooterViewDelegate>
// 设置代理对象
footerView.delegate = self;
- (void)footerViewUpdateData:(CZFooterView *)footerView {
//完成数据传输
}