定义是什么就不说了...
他们能干嘛?
分类:
1、声明私有方法
2、功能分解,当一个类很庞大的时候,可以使用分类分离一些功能。类似于如果一个函数里面有很长的代码的时候,就会将一些代码进行封装成其他函数进行调用。
3、把framework的私有方法公开化。
用法还是蛮多的,说一段实例:前两天我正在对公司项目的网络部分进行封装的时候,有一对象的函数在很多地方都用过了,但是后来发现这个方法,是需要根据环境进行不同方法的调用的。怎么办呢?我一不想改人家的封装,二是不想一个个去改。这个时候就用到了分类(这个分类当然就是针对那个类),在分类中重写load方法,用runtime将自己定义的方法和原对象方法进行交换,这样我就能在里面处理我自己的逻辑了。不过这种方法还是少用为好.....
扩展:
1、声明私有属性
2、声明私有方法
3、声明成员变量
他们的区别是什么?
分类特点:
1、运行时决议 ,就是在运行时才会为宿主类拼接内容
2、可以为系统类添加分类
3、可以添加实例方法、类方法、协议、属性(并不是实例变量 使用关联对象)
·多个分类的有同名方法,最后编译的方法会生效,因为源码中在添加方法的时候是倒序遍历的;
·分类方法会覆盖父类方法,其实覆盖并不是真正的覆盖,原类中的方法指针还是在的,可以通过IMP指针进行原类的方法调用。
扩展特点:
1、编译时决议
2、只能够声明,只能在宿主类中实现,一般都是放在宿主类的.m文件中。
3、不能够为系统类添加扩展
怎样为分类添加成员变量?
设计的方法有三个:
//关联对象
voidobjc_setAssociatedObject(id object, constvoid*key, id value, objc_AssociationPolicy policy)
//获取关联的对象
id objc_getAssociatedObject(id object, constvoid*key)
//移除关联的对象
voidobjc_removeAssociatedObjects(id object)
为分类添加的属性到底添加到哪了?
关联对象是由AssociationsManager全局单例进行管理 并在AssociationsHashMap存储,也就是所有对象的关联对象内容都放在了一个容器中。
AssociationsManager -> AssociationsMap(key(selector) , value)-> AssociationsHashMap(key(object), value)
网友评论