黑马程序员技术交流社区

标题: 03延展,bloc,协议,@required与@optional,代理 [打印本页]

作者: bjwqcpy@126.com    时间: 2016-10-13 23:11
标题: 03延展,bloc,协议,@required与@optional,代理

#pragma mark - 09 block作为函数的参数 [掌握]

   

block就是一个类型

   

    block和函数以及方法有什么关系

   

    int 可以作为函数的参数

    int 可以作为函数的返回值

    int 可以作为方法的参数

    int 可以作为方法的返回值

   

函数参数的作用:可以将函数调用者的数据传递到函数内部使用

   

block作为函数参数的作用:可以将调用者的一段代码传递到函数内部使用

   

函数的内部需要执行一段代码,但是这段代码是什么,在定义函数的时候不确定,而是由调用函数的时候确定的,这个时候函数就可以对外提供一个block类型的参数,用来在调用的时候传入一段代码执行.

   

不要为了使用block而使用block

   

    block只是一个类型,用来保存一段代码

    如果函数的参数需要是一段代码,此时只能使用block来作为参数

    千万不要滥用

   

   


#pragma mark - 10 block作为方法的参数 [掌握]

        最好的方式就是 方法的内部不要去处理.

        而是交给调用者去处理.

#pragma mark - 11 block作为方法的参数2 [掌握]

            每个调用者的规则是不一样的.,方法内部不要写死规则

        具体的规则有调用者决定



#pragma mark - 12 block与函数的异同 [掌握]

   

    1.相同点:

        可以封装一段代码

    2.不同点:

        1.block是一个数据类型

            a)可以使用block声明变量

            b)可以作为函数或者方法的参数

            c)可以作为函数或者方法的返回值

        2.函数不是一个数据类型

            不具备以上三个特点



#pragma mark - 0_13 协议的基本使用 [掌握]

1.什么是协议

    1.协议是OC中特有的语法

    2.协议使用@protocol声明

    3.在协议中专门用来写方法声明


2.协议有什么作用

协议可以让类遵守,一个类如果遵守了某份协议,就默认拥有了该协议中的所有方法的声明,直接实现即可


3.怎么用

1.定义协议的格式

@protocol 协议名称 <NSObject>


// 方法的声明


@end

2.让类遵守协议

@interface 类名 : 父类名 <协议名称>


@end


@implementation 类名


// 实现协议中的方法


@end


4.注意

    1.协议中只能写方法的声明,不能写方法的实现

    2.协议中不能声明成员变量

    3.协议中可以使用@property

        1.只会生成对应的getter和setter的声明

        2.不会生成对应的getter和setter的实现

        3.不会生成_开头的成员变量

    4.:是继承,<>遵守协议

    5.一个类遵守某分协议,这个类只是拥有了协议中所有方法的声明,而不会自动生成方法的实现,需要手动实现

        如果类没有实现协议中的方法,可以通过该类的对象调用协议中的方法,在编译阶段没有问题

        但是如果运行阶段,调用了该方法,但是找不到方法的实现,程序就会崩溃

    6.如果父类遵守了某份协议,子类默认就会遵守该协议


#pragma mark - 0_14 协议可以多遵守 [掌握]


1.OC中一个类只能有一个父类

2.OC中一个类可以遵守多份协议


#pragma mark - 0_15 @required与@optional [掌握]

OC的关键字,用来修饰协议中的方法


@required说明方法是强制要求实现的

被@required修饰的方法,如果在遵守协议的类中没有实现该方法,编译器会报警告,但是不会报错

如果这个方法在协议中是强制要求实现的,不需要判断,直接调用即可


@optional说明方法是可选的,可以实现也可以不实现

被@optional修饰的方法,如果在遵守协议的类中没有实现该方法,编译器没有任何提示

如果这个方法在协议中是可选的,在调用之前需要判断代理是否实现了这个方法


作用:增加代码的可读性,方法程序员之间沟通


默认是@required


#pragma mark - 0_16 NSObject基协议 [掌握]


1.什么叫做协议的继承

    1.协议A继承自协议B,协议A叫做协议B的子协议,协议B是协议A的父协议

    2.协议A就拥有了协议B中所有方法的声明

    3.格式:

    @protocol 协议A <协议B>

    @end


2.一个类遵守了协议A,就相当于拥有了协议A和协议B中所有方法的声明


3.设么叫做协议的多继承

一个协议可以继承自多个协议


4.什么是NSObject协议

    1.NSObject类叫做基类,还有一个NSObject协议叫做基协议

    2.OC中所有的协议,都需要直接或者间接的继承自NSObject基协议

    3.NSObject类是遵守NSObject协议的,NSObject协议中定义了所有协议都需要拥有的方法


5.所有的协议,都拥有了NSObject协议中声明的方法



#pragma mark - 0_17 协议与其他的比较 [掌握]


category分类

将一个类分成多个模块

给一个类增加新的方法


extension扩展

一个类的私有声明,专门用来声明私有的方法和成员变量


protocol协议

声明方法,可以让其它类遵守,类一旦遵守了某个协议,默认就拥有了该协议中所有方法的声明


@interface 声明一个类


@implementation 实现一个类



: 继承

<> 遵守协议



#pragma mark - 0_18 协议的类型限制 [掌握]


1.需求:定义一个指针变量

    1.能够指向任意类型的对象

    2.指向的对象必须要遵守指定的协议


作用:

    1.只有遵守指定协议的对象,才能赋值给该指针变量

    2.通过这个指针,一定可以调用协议中的方法,而不需要关心具体的对象是谁

      (因为对象所属的类,肯定遵守了指定的协议,所以拥有该协议中方法的声明)


练习:

1.写一个买水协议,协议里面有三个方法,问价钱,给钱,拿水离开

2.用id指针指向任意一个对象,要求这个对象必须会买水"创建狗类,机器人类

3.调用这个对象的买水方法



#pragma mark - 0_19 大家一起找女朋友 [掌握]


#pragma mark - 02 代理设计模式 [掌握]


代理使用的步骤(套路)

1.定义一个协议,声明代理需要具有的方法

2.找到使用代理的类

    1.定义一个id类型的属性,一般命名为delegate,使用协议对指针指向的对象类型进行限制

    2.定义一个对象方法,在其中调用代理的方法,完成某些功能

3.作为代理的类

    1.遵守协议

    2.实现协议中声明的方法



保姆和婴儿


照顾婴儿的协议 careBabyProtocol

喂婴儿吃饭

哄婴儿睡觉


婴儿类

属性:体力值\睡眠值\代理(保姆)

方法

    想吃饭

    想睡觉


保姆喂婴儿吃饭之后,婴儿的体力值增加

保姆哄婴儿睡觉之后,婴儿的睡眠值增加





作者: 邱中林    时间: 2016-10-13 23:42
马上考试,~~很及时啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2