类别(category)、扩展(extension)、关联(Associated)

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 来移除某个已有的关联对象


总结:

类别:不需要有源码,只能扩展方法

关联:不需要有源码,只能扩展属性

扩展:需要有源码,可以扩展任何东西

你可能感兴趣的:(类别(category)、扩展(extension)、关联(Associated))