#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
喂婴儿吃饭
哄婴儿睡觉
婴儿类
属性:体力值\睡眠值\代理(保姆)
方法
想吃饭
想睡觉
保姆喂婴儿吃饭之后,婴儿的体力值增加
保姆哄婴儿睡觉之后,婴儿的睡眠值增加
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |