美文网首页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