分类和扩展
2021-12-06 本文已影响0人
进击的阿牛哥
一般用分类做什么?
1,声明私有方法
2,分解体积庞大的类文件
3,把framework的私有方法公开
分类的特点
1,运行时决议
2,可以为系统类添加分类(UIview 获取坐标的方法)
分类中都可以添加哪些内容
1,实例方法
2,类方法
3,协议
4,属性(分类当中定义了1个属性,实际上只声明了对应的set get方法,并没有为我们在分类中添加实例变量(通过关联对象为分类添加实例变量))
总结
1,分类添加的方法可以“覆盖”原类方法
2,同名分类方法谁能生效取决于编译顺序
3,名字相同的分类会引起编译报错
能否给分类添加“成员变量”?
能,通过关联对象为分类添加实例变量
关联对象的本质
objc_getAssociatedObject, remove,
我们添加两个分类,分别为A和B,两个分类当中都有1个同名的方法,那个方法才会最终会生效?实际上取决于分类的编译顺序,最后编译的那个分类当中的同名方法才会最终生效,之前的会被覆盖掉(最后编译的分类的当中方法会最早生效)。
一般用扩展做什么?
1,声明私有属性(不对子类暴露) 2 声明私有方法 3声明私有成员变量
扩展的特点 以及分类的区别
1,编译时决议 (分类是运行时决议)
2,只以声明的形式存在,没有具体实现,多数情况下寄生于宿主类的.m中
(分类可以有声明,也可以有实现)
3,不能为系统类添加扩展(可以为系统类添加分类)