#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 喂婴儿吃饭 哄婴儿睡觉
婴儿类 属性:体力值\睡眠值\代理(保姆) 方法 想吃饭 想睡觉
保姆喂婴儿吃饭之后,婴儿的体力值增加 保姆哄婴儿睡觉之后,婴儿的睡眠值增加
|