比較iOS類別Category和擴展Extension以及runtime的associative(關聯)機制(容我水一發)

              目前網上有很多介紹類別與擴展的文章,我這裏就不班門弄斧了。我主要總結了一下他們之間的區別與聯繫。

          Category與Extension在代碼上的區別如下:

          Category聲明如下

@interface Demo (Category)

@end
          Extension聲明如下
@interface Demo ()

@end
          Extension就像是匿名的類別,()裏面沒有內容。另外,Category一般只能添加方法,不能添加屬性,爲什麼是一般呢,因爲Category在藉助associative(關聯)機制的情況下是可以添加屬性的,下文我們會說到。Category添加的方法不一定要實現。Extension不同,擴展既可以添加方法,也可以添加屬性,但是擴展添加的方法必須要在.m文件中實現。

         下面我們介紹一下associative(關聯)機制來實現Category添加屬性,我們可以這麼寫

<pre name="code" class="objc">// Declaration

@interface MyObject (ExtendedProperties)
@property (nonatomic, strong, readwrite) id myCustomProperty;
@end

// Implementation

static void * MyObjectMyCustomPorpertyKey = (void *)@"MyObjectMyCustomPorpertyKey";

@implementation MyObject (ExtendedProperties)

- (id)myCustomProperty
{
        return objc_getAssociatedObject(self, MyObjectMyCustomPorpertyKey);
}

- (void)setMyCustomProperty:(id)myCustomProperty
{
        objc_setAssociatedObject(self, MyObjectMyCustomPorpertyKey, myCustomProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end



          這裏有一篇博客,推薦大家可以下,是關於關聯機制的,講解的比較詳細    http://blog.csdn.net/onlyou930/article/details/9299169

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章