在iOS开发中,如果你要在不改变原来的类内容的基础上,为类增加一些方法,那么苹果提供了一个很好机制,那就是分类,当然我们平时可能比较多的是直接给他添加方法,并且我们清楚一点的是,我们还能给一个分类添加属性(使用关联对象),但是并不能添加成员变量,可是为什么刚好成员变量就不能连接呢……
分类
概念:
Category 分类是OC特有的语言,依赖于类。
分类的作用:
在不改变原来的类内容的基础上,为类增加一些方法。
分类增加属性和方法
属性
方法
这里其实就不用做过多介绍了,只需要知道分类增加方法其实就和一个类增加一个方法一样。
属性
至于分类增加属性,只要使用到的就是Objective-C里面比较底层的一个技术Runtime,Runtime里面有个里面有个关联对象的概念,具体请查看官方或者相关资料,很简单。
成员变量
NO,NO,NO,分类是不能增加属性的,一定没办法,如果你有可以来找我,哈哈….
为什么不能增加成员变量呢?
首先我们不能混淆了成员变量和属性的概念.Property是Property,Ivar是Ivar。
分类里面不能添加Ivar是因为分类本身并不是一个真正的类(Objective-C中真正的类是有一个isa存在的),但是分类并没有自己的ISA .
类最开始生成了很多基本属性,比如IvarList,MethodList,分类只会将自己的method attach到主类,并不会影响到主类的IvarList。
这就是为什么分类里面不能增加成员变量的原因”
类和分类的初始化
1.当程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法,只会调用一次;
2.当第一次使用某个类时,就会调用当前类的+initialize方法;
3.先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法,最后调用分类的+load方法),先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)。
4.注意:在初始化的时候,如果在分类中重写了+initialize方法,则会覆盖掉父类的。
5.重写+initialize方法可以监听类的使用情况。