• 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
    
    
    
    
    

  • 相关阅读:
    SAP和ABAP内存的区别
    ABAP如何限制自己开发的耗时报表在sap系统中运行的个数,以保证正常业务的进行
    ABAP如何创建动态结构的报表
    FISAP财务成本知识库
    ABAPSAP显示处理进度的函数
    ABAP如何在REUSE_ALV_GRID_DISPLAY标识不同行用不同的颜色
    Java: 获取当前执行位置的文件名/类名/方法名/行号
    查询不重复的列
    [转载]用SQL语句添加删除修改字段
    [转载]查询之order by,group by和having的使用(一)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4253534.html
Copyright © 2020-2023  润新知