Procotol 和 Delegate

目录

Procotol
  • 协议的概念
  • 协议的分类
  • 协议的定义
  • 协议的遵循
  • 协议的方法
  • 协议的属性
Delegate

一、Procotol

1、协议的概念

协议是一种约定,凡是遵守这个约定的类,就要履行约定中规定的义务。类似java中的接口。

2、协议的分类

协议又分为正式协议和非正式协议

在OC2.0 中引入可选的正式协议之前,非正式协议是foundation和AppKit类实现委托的唯一方式。

所谓非正式协议:NSObject及其子类的分类。

3、协议的定义

@protocol  #protocol name#

    #methods#

@end

4、协议的遵循

  • 其他类来遵循协议的时候,通过尖括号来包含协议,放到声明后,如下代码:
    具体实现例子如下所示:

        @interface MyClass : NSObject 
         ...
        @end
    
  • 协议也可以遵循其他协议,可遵循一个,也可多个,多个用逗号隔开。

5、协议的方法

  • @optional 表示可选的实现方法
  • @required 表示必须实现的方法
  • 通过respondsToSelecor 方法来判断是否实现了某个方法。

6、协议的属性

一般都是在协议中定义方法, 那么可以不可以声明属性呢? 可以,和分类的情况类似,分类可以声明属性,然后通过objc_getAssociatedObject 和 objc_setAssociatedObject来实现set和get方法。

同样,在协议中也可以声明属性,但也不会给提供set和get方法,与分类不同的是,协议中声明的属性,需要类在遵守该协议时,通过@synthesize关键字来告诉系统来配置set和get 方法。

  @interface ViewController : UIViewController
  @end
  @implementation ViewController
  @synthesize myImage = _myImage;
  - (void)viewDidLoad {
      [super viewDidLoad];
      self.myImage = @"my string";
      NSLog(@"%@,%@",_myImage,self.myImage);
  @end

二、Delegate

delegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委托者来处理.
一个标准的委托由以下部分组成:

协议的声明+委托者的协议属性+ 被委托者实现协议+建立关联+调用委托事件;

1、在委托者的.h中,制定协议、声明代理协议属性

#import 
@protocol KLMSearchBarDelegate 
@optional
- (void)didSearchBarColorChange:(UIView *)search statusBarStyle: (UIStatusBarStyle)statusBarStyle;
@end

@interface KLMMainSearchBarView : UIView 
@property(nonatomic,weak) id   statusBarDelegate;
@end

2、在委托者的.m文件中,通知代理

  if (self.statusBarDelegate && [self.statusBarDelegate respondsToSelector:@selector(didSearchBarColorChange:statusBarStyle:)]) {
            [self.statusBarDelegate didSearchBarColorChange:self statusBarStyle:UIStatusBarStyleDefault];
   }

3、在被委托者中遵守协议、并将自己设置为委托者的代理

@interface KLMMainViewController ()

 _searchBarView.statusBarDelegate = self;

4、在被委托者中,实现协议中的方法。

- (void)didSearchBarColorChange:(UIView *)search statusBarStyle:(UIStatusBarStyle)statusBarStyle {
self.statusBarStyle = statusBarStyle;
[self setNeedsStatusBarAppearanceUpdate];
}


代理模式的本质是回调,当委托者的发生改变,需要通知被委托者时,会回调被委托者中实现协议的方法,而协议是连接委托者和被委托者的桥梁。

你可能感兴趣的:(Procotol 和 Delegate)