目录
Procotol
- 协议的概念
- 协议的分类
- 协议的定义
- 协议的遵循
- 协议的方法
- 协议的属性
Delegate
一、Procotol
1、协议的概念
协议是一种约定,凡是遵守这个约定的类,就要履行约定中规定的义务。类似java中的接口。
2、协议的分类
协议又分为正式协议和非正式协议
在OC2.0 中引入可选的正式协议之前,非正式协议是foundation和AppKit类实现委托的唯一方式。
所谓非正式协议:NSObject及其子类的分类。
3、协议的定义
@protocol #protocol name#
#methods#
@end
4、协议的遵循
-
其他类来遵循协议的时候,通过尖括号来包含协议,放到声明后,如下代码:
具体实现例子如下所示:@interface MyClass : NSObject <MyProtocol,...> ... @end
-
协议也可以遵循其他协议,可遵循一个,也可多个,多个用逗号隔开。
5、协议的方法
- @optional 表示可选的实现方法
- @required 表示必须实现的方法
- 通过respondsToSelecor 方法来判断是否实现了某个方法。
6、协议的属性
一般都是在协议中定义方法, 那么可以不可以声明属性呢? 可以,和分类的情况类似,分类可以声明属性,然后通过objc_getAssociatedObject 和 objc_setAssociatedObject来实现set和get方法。
同样,在协议中也可以声明属性,但也不会给提供set和get方法,与分类不同的是,协议中声明的属性,需要类在遵守该协议时,通过@synthesize关键字来告诉系统来配置set和get 方法。
@interface ViewController : UIViewController<MyProtocol>
@end
@implementation ViewController
@synthesize myImage = _myImage;
- (void)viewDidLoad {
[super viewDidLoad];
self.myImage = @"my string";
NSLog(@"%@,%@",_myImage,self.myImage);
@end
二、Delegate
delegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委托者来处理.
一个标准的委托由以下部分组成:
协议的声明+委托者的协议属性+ 被委托者实现协议+建立关联+调用委托事件;
1、在委托者的.h中,制定协议、声明代理协议属性
#import <UIKit/UIKit.h>
@protocol KLMSearchBarDelegate <NSObject>
@optional
- (void)didSearchBarColorChange:(UIView *)search statusBarStyle: (UIStatusBarStyle)statusBarStyle;
@end
@interface KLMMainSearchBarView : UIView
@property(nonatomic,weak) id<KLMSearchBarDelegate> statusBarDelegate;
@end
2、在委托者的.m文件中,通知代理
if (self.statusBarDelegate && [self.statusBarDelegate respondsToSelector:@selector(didSearchBarColorChange:statusBarStyle:)]) {
[self.statusBarDelegate didSearchBarColorChange:self statusBarStyle:UIStatusBarStyleDefault];
}
3、在被委托者中遵守协议、并将自己设置为委托者的代理
@interface KLMMainViewController ()<KLMSearchBarDelegate>
_searchBarView.statusBarDelegate = self;
4、在被委托者中,实现协议中的方法。
- (void)didSearchBarColorChange:(UIView *)search statusBarStyle:(UIStatusBarStyle)statusBarStyle {
self.statusBarStyle = statusBarStyle;
[self setNeedsStatusBarAppearanceUpdate];
}
代理模式的本质是回调,当委托者的发生改变,需要通知被委托者时,会回调被委托者中实现协议的方法,而协议是连接委托者和被委托者的桥梁。
网友评论