美文网首页iOS基础知识
类别(category)、扩展(extension)、关联(As

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

作者: 慧惠 | 来源:发表于2015-12-17 17:03 被阅读96次

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)是可以添加属性的,但是没有下划线的成员变量,也不会生成set和get方法
  • tom510230:IOS的类别和扩展是两个概念,用法也完全不同,所以扩展的概念还要再写一次

本文标题:类别(category)、扩展(extension)、关联(As

本文链接:https://www.haomeiwen.com/subject/pwhphttx.html