1、类别(category)
1)需求:
如果要给一个已经存在的类添加方法,可以使用类别。
2)一般表达
@interface ClassName ( CategoryName )
// method declarations
@end
3)例如:
4)注意:
a、类别是类的扩展,只可以声明方法,不可以声明变量。并且,类别的方法优先级较高,可覆盖原类方法。
b、类别的方法中,不可以调用super方法。--类别的局限
c、category 方法不能覆盖于同一class 的其它 category 中的方法。因为不法预知他们的加载优先顺序,就可能在编译时出错。
2、扩展(extension)
1、某些情况下,我们需要声明一个@property,它对外是只读的(readonly),而对内是可读写的(readwrite),这时,可以通过Extensions实现
2、使编辑器可以更好的验证类的私有的方法或者变量
3、关联(Associated)
1、objc_setAssociatedObject 用于给对象添加关联对象,传入 nil 则可以移除已有的关联对象
2、objc_getAssociatedObject 用于获取关联对象
3、objc_removeAssociatedObjects 用于移除一个对象的所有关联对象
注:objc_removeAssociatedObjects 函数我们一般是用不上的,因为这个函数会移除一个对象的所有关联对象,将该对象恢复成“原始”状态。这样做就很有可能把别人添加的关联对象也一并移除,这并不是我们所希望的。所以一般的做法是通过给 objc_setAssociatedObject 函数传入 nil 来移除某个已有的关联对象
总结:
类别:不需要有源码,只能扩展方法
关联:不需要有源码,只能扩展属性
扩展:需要有源码,可以扩展任何东西
网友评论