美文网首页
3.OC-block和protocol

3.OC-block和protocol

作者: 萤火虫儿飞_ | 来源:发表于2018-03-31 11:08 被阅读33次

    一、【掌握】block的typedef

    定义1个叫做:MyBlock的数据类型,它存储的代码必须返回int,,必须接受2个int类型参数

    typedef int(^MyBlock)(int,int);

    重命名之后,可这样使用:

    MyBlock minusBlock = ^(int num1,intnum2){

    returnnum1 - num2;

    };

    二、Block访问外部变量

    block内部可以直接访问外部变量,但不可修改

    加了双下划线block修饰的外部变量,可以在block内部修改,否则不可修改。

                    __block int a = 10;

            void (^mblock)() = ^

            {

                a = 20;

                NSLog(@"%d",a);

            };

            mblock();

    你给我注点意

    block还可以做函数的参数

    void preWork(void (^workBlock)());

    做函数的返回值

    typedef int(^myBlock) (intnum1,int num2);

    myBlock test()

    {

        myBlock work = ^(int x,int y)

        {

            return x + y;

        };

        return work;

    }

    block结构的快速提示:

    输入:inlineBlock

    三、Protocol概念及基本使用

    1.什么是protocol?

    中文意思是:协议。

    协议中只能声明一些方法。

    遵守了协议,就等用户拥有了协议中的所有方法。

    2.协议的基本用法

    协议的定义格式

    @protocol 协议名称

    //各种方法

    @end

    协议的使用格式

    @interface 类名:NSObject<协议名1,协议名2,…>

    @end

    3.protocol的基本使用

    想要给不类添加相同方法时,可以使用协议。

    如:人和狗都能吃东西,都能跑,能跳,但是不存在继承关系。

    // 导入运动协议的头文件#import"SportProtocol.h"

    // 遵守运动协议@interfacePerson : NSObject

    @end

    然后直接在.m文件中实现即可

    注意:当遵守了协议,而没有实现协议中的方法时,会报警告(⚠)

    4.【掌握】protocol的其他用法

    1.【理解】protocol的使用注意

    把同一类方法,放到一个协议中去

    一个类可以同时遵守多个协议

    父类遵守了某个协议,子类也遵守该协议

    协议遵守协议:一个协议可以遵守多个协议

    2.【掌握】protocol基协议介绍

    @protocol SportProtocol

    @end

    此处的NSObject就是基协议,意义等同于继承NSObject。

    继承基协议的好处:能够拥有基协议当中声明的所有方法。、

    总结:

    需要添加成员变量和方法时,建议使用继承

    只需要添加方法时,建议使用分类

    当很多不同类中,有共同的方法可以抽取时,类之间不存在继承关系,建议使用协议。

    5.【掌握】protocol中@required和@optional

    @required:用@required修饰的方法,必须实现

    @optional:用@optional修饰的方法,可实现,也可不实现

    @required和@optional的主要意义:一般用于程序员交流用

    id和instancetype的区别

    1)instancetype只能作为函数或者方法的返回值

    2)id能作为方法或者参数的数据类型、返回值,也能用来定义变量。

    3)instancetype对比id的好处:

    能精确的限制返回值的具体类型。

    6.【理解】protocol的使用补充

    1.protocol的引用方式

    类似@class的使用方式

    在需要遵守协议的地方,使用@protocol协议名

     // 使用@protocol是告诉编译器,这是一个协议

    @protocol SportProtocol;

    @interface Person : NSObject

    - (void)run;

    @end

    注意:在.m文件中

    使用#import引入协议的头文件

    实现协议对应的方法

    2.在类的声明中,定义协议(不要再单独把协议定义在xx.h文件中)

    @protocol SportProtocol;

    - (

    void)run;

    @end

    @interface Person : NSObject

    @end

    缺点:不够灵活

    7.【掌握】protocol代理设计模式概念

    代理模式概念

    传入的对象,代替当前类完成了某个功能,称为代理模式

    利用协议实现代理模式的主要思路为:

    定义一个协议,里面声明代理类需要实现的方法列表,比如这里:一个代理类需要实现:feedBaby与HongSleep方法

    创建一个代理类(比如BaoMu),遵守上面的代理协议

    在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量。(delegate)

    在Baby类中调用成员变量delegate(代理)的方法,调用代理类的方法

    Main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值

    protocol代理模式应用场合

    代理设计模式的场合:

    当对象A发生了一些行为,想告知对象B

          (让对象B成为对象A的代理对象)

    对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)

    当对象A无法处理某些行为的时候,想让对象B帮忙处理。(让对象B成为对象A的代理对象)

    1)监听器的场合

    Teacher想监听Baby的一些行为

    2)通知的场合

    Baby发生了一些行为,想告知Teacher

    3)有些事情,不想自己处理,想交给别人处理

    Baby发生了一些行为,但是自己不会处理,可以交给Teacher处理。

    8.【掌握】protocol类型限制

    类型限制:

    id d = [[Person alloc] init];

    要求:变量d指向的对象必须遵守PlayProtocol协议

    id d = [[Person alloc] init];

    要求:要求Person创建出来的对象,必须遵守PlayProtocol协议。

    Person < PlayProtocol > *p = [[Person alloc] init];

    真实使用场景:

    @interface Person :NSObject

    @end

    这样创建的任何对象,都拥有协议当中的方法。

    相关文章

      网友评论

          本文标题:3.OC-block和protocol

          本文链接:https://www.haomeiwen.com/subject/eplgcftx.html