category、block、protocol、SEL

来源:互联网 发布:asmr软件 编辑:程序博客网 时间:2024/06/06 09:43

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,匹配相应的方法并使用。


0 0
原创粉丝点击