黑马程序员技术交流社区
标题:
Block学习笔记
[打印本页]
作者:
杨光0618
时间:
2016-8-27 19:37
标题:
Block学习笔记
Mark 01 block与函数的异同点
1.block与函数
相同点
他们都可以封装一段代码
不同点
block是一个数据类型,而函数就是一个函数
block函数声明变量,而函数是不能的
block可以作为函数的参数传递,函数不能直接作为另一个函数参数
2.block作为函数的返回值
typedef void (^newType)();
newType test()
{
newType myBlock = ^{
NSLog(@"好的好的");
};
return myBlock;
}
Mark 02 protocol协议的基本使用
1.协议是串门用来写方法声明,不能写属性
遵循了协议的类,这个类就拥有了这份协议中的所有方法的声明,而不用自己去定义
声明一个协议
@protocol PHprotocol <NSObject>
方法的声明
@end
协议中可以写@property,但协议中的@property只会生成getter和setter方法的声明
类遵循协议
如果一个雷想要拥有某个协议中的所有方法的声明,只需要遵循这个协议即可
遵循协议的格式
@interface PHPerson : NSObject <PHprotocol>
@end
:是继承
<>是协议
类遵守一份协议,这个类仅仅是有了这份协议中的方法的声明,不会自动实现,所以需要自己实现
如果遵守协议,但没有实现协议中的方法,编译器在编译的时候不会报错,仅仅给出一个警告
在执行的时候,如果调用这个协议的方法,而没有进行在类中实现,那么就会报错
如果父类遵守了某个协议,那么父类下的子类全都继承此协议
Mark 03 协议多重遵守
1.多重遵守协议的语法
@interface PHPerson : NSObject <PHprotocol,PHagreement>
@end
多个协议之间用逗号隔开
这时这个类中同时拥有了两个协议中的方法的声明
Mark 04 协议的@required和optional关键字
1.用来修饰协议中的方法
@protocol PHprotocol <NSObject>
@required
- (void)saiHi;
@end
如果协议中的方法是被@required修饰,类中若没有对此协议中方法进行实现,那么编译器会报一个警告
@protocol PHprotocol <NSObject>
@optional
- (void)saiHi;
@end
如果遵循此协议的类没有对@optional修饰的方法没有进行实现,那么编译器连警告都没有
这两个参数没多大的作用,主要是程序员之间的沟通
协议默认是@required
Mark 05 协议与协议之间可以多继承
1.如果一个类遵守了某份协议,就相当于拥有了这份协议以及其父协议中的所有方法的声明
2.Foundation框架中有一个NSObject协议,NSObject类遵循NSObject协议
3.所有协议必须直接或间接的从NSObject基协议继承
Mark 06 协议 延展 分类的比较
1.分类
将一个类分为多个模块,用来为一个类添加方法
2.延展
专门用来私有化类的成员
3.协议
定义一份协议,可以让其他的类遵守这个协议,遵守之后,类就拥有协议中的方法的声明
4.继承
子类继承父类,就拥有父类中的所有成员
Mark 07 协议的类型限制
1.id<SportProtocol> id1;
这个时候,id指针要求指向的对象必须遵守SportProtocol协议,否则会有一个大大的警告
2.id<SportProtocol,StudyProtocol> id2;
这时,id指针要求指向的对象必须遵守多个协议,否则会有一个大大的警告
3.Person<SportProtocol> *p1;
这个指针可以指向任意的Person对象,这个指针指向的对象必须遵守A协议,如果没有,则编译器会发出警告
4.为什么要做类型限制?
只有遵守了协议的类,才100%拥有这个协议中的方法,后边要调用这个对象的协议方法,为了保证 这个对象中一定有这个方法,所以要求指针指向的对象要遵守协议
Mark 08 代理设计模式
1.为方法传递数据的方式
参数
少量的参数,和数据
block
传代码
代理
大量参数和数据
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2