category、block、protocol、SEL
category
作用:扩充一个类的功能
命名规范: 类名+分类名
优点:降低类间的耦合性(继承拥有高耦合性)
在分类中:
1.可以通过self使用主类中的其它方法。
2.只要在原类中声明的实例变量,都可以在分类中直接访问。
3.不可以声明实例变量。
注意:
1.若分类中的方法名与主类中的方法相同,原类中的方法相当于被覆盖了。
2.若多个分类中有多个方法的方法名相同,会调用最后被编译的分类文件中的方法。
block
块是一种数据类型,不是指针。
优点:block弥补了函数指针不能够直接保存一个函数体的缺憾。
int (^ sumBlock)(int a, int b)
= ^int(int a, int b){//statements;};
可以将block与typedef结合,以便简化使用
例如:
使用下列定义后
typedef int (^sumBlock)(int a, int b)
可以直接使用 sumBlock
块的用途:
1.封装变化
例如:在开发中,若有一个方法有多种算法可以实现时,可以将其最后一个形参设置为block,由此在每次使用此方法的时候,可以传入不同的算法,提高代码的重用性。
2.提高效率
PS:若想在block中改变外部变量的值,外部变量需要使用__block修饰符修饰(很少用)
Protocol
基本格式:
@protocol
@required //必须实现(有警告)
@optional //可选实现(没有警告)
@end
用途:
1.代理设计
私有协议:如果仅想自身遵循一些协议(其他类不遵循),直接写在类的.m文件中。
如果想定义一些属性或变量必须遵循某些协议,那么可以在定义的属性或变量后面直接使用<>来强调所需遵循的协议。
例如:
id<UITableViewDataSource> delegate;//必须遵循数据源代理协议
SEL
SEL数据类型是用来包装方法的。
OC中的消息机制:
1.向指定对象发送消息。
2.将消息通过@selector包装成SEL数据类型。
3.通过指定对象的isa,匹配相应的方法并使用。