zoukankan      html  css  js  c++  java
  • iOS开发之protocol和delegate

     protocol——协议

    协议是用来定义对象的属性,行为和用于回调的。
        协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@optional表示可选的方法,用不到能够不写。
    就像UITableView,它有两个协议:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是规定行为操作的,里面的方法都是可选的方 法,UITableViewDataSource是规定数据存储结构的,有两个必选方法。因此你再实现UITableViewDataSource时必需要定义这两个方法,否则程序会出错。
    假设你使用了响应的类或者控件,假设该类定义了协议,就能够依据须要实现该协议。


    protocol和java里interface的概念类似,是Objective-C语法的一部分。
    定义protocol例如以下
    @protocol ClassADelegate
     
    - (void)methodA;
    - (void)methodB;
     
    @end

    那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

    函数是须要被实现的,所以假设对于class例如以下

    @interface ClassB <ClassADelegate> {
    }
    @end

    就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
    也就是实现了这一组函数。

    有了上面这个头文件,我们就能够放心作调用

    ClassB *b = [[ClassB alloc] init];
    [b methodA];
    [b methodB];

    而不用操心出现unrecognized selector sent to instance这样的错误了。

    所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。

    id<ClassADelegate> b = ...;
    [b methodA];

    这样的使用方法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。


    delegate——托付,代理
    
    
    
    适用场合:
    类A调用类B, 当类B想回调类A的方法的时候, 要用到delegate
    要理解以下的代码的话, 要知道的一个知识点是 协议(protocal)
    
    文件:ClassA.h
    #import <Foundation/Foundation.h>
    #import "ClassB.h"
    @interface ClassA : NSObject<SampleProtocal>
    - (void)test;
    @end
    
    
    文件:ClassA.m
    #import "ClassA.h"
    @implementation ClassA
    
    
    -(void)test{
        ClassB *classB = [[ClassB alloc] init];
        classB.delegate = self;
        
        [classB actionOfClassB];
    }
    
    
    -(void)callback{
        NSLog(@"这种方法会被类B调用");
    }
    @end
    
    
    文件:ClassB.h
    #import <Foundation/Foundation.h>
    
    @protocol SampleProtocal <NSObject>
    @required
    - (void)callback;
    @end
    
    
    @interface ClassB : NSObject{
        id<SampleProtocal> delegate;
    }
    @property (nonatomic, retain) id<SampleProtocal> delegate;
    
    
    - (void)actionOfClassB;
    
    
    @end
    
    
    文件:ClassB.m
    #import "ClassB.h"
    
    
    @implementation ClassB
    @synthesize delegate;
    -(void)actionOfClassB{
        [delegate callback];
    }
    @end
    
    
    
    
    

  • 相关阅读:
    Fitness
    【数据分析师 Level 1 】10.数据采集方法
    【数据分析师 Level 1 】9.MySQL简介
    【数据分析师 Level 1 】8.数据库简介
    【数据分析师 Level 1 】7.机器学习的基本概念
    【数据分析师 Level 1 】6.一元线性回归
    【数据分析师 Level 1 】5.方差分析
    【数据分析师 Level 1 】4.假设检验
    【数据分析师 Level 1 】3.抽样分布及参数估计
    【数据分析师 Level 1】2.描述性统计分析
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4253534.html
Copyright © 2011-2022 走看看