分類和類擴展

 分類(Category) 和 類擴展(Extension) 

分類(Category)

1、給已經存在的類增加方法(可以不實現),不能增加成員變量(可以通過Runtime來給分類添加屬性)

2、分類可以訪問原來類中的成員變量

3、如果分類和原來的類出現同名的方法,優先調用分類中的方法     優先級是:分類 (最後參與編譯) -> 原來類 -> 父類

4、分類可以重新實現原來類中的方法,但是會覆蓋掉原來類方法,導致原來類的方法無法使用

優點: 1、減少單個文件的體積   2、把不同的功能組織到不同的Category 中,方便多個開發者完成一個類  3、聲明私有方法   4、模仿多繼承等

通過運行時給分類添加屬性:

@interface NSObject (SpecialName)
@property (nonatomic, copy) NSString *specialName;
@end
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *SpecialNameKey = &SpecialNameKey;    
@implementation NSObject (SpecialName)
@dynamic specialName;

- (NSString *)specialName {
    //如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,再通過對象獲取非id類型屬性
    return objc_getAssociatedObject(self, SpecialNameKey);
}
- (void)setSpecialName:(NSString *)specialName{
    //如果屬性值是非id類型,可以通過屬性值先構造OC的id對象,再通過對象獲取非id類型屬性
    objc_setAssociatedObject(self, SpecialNameKey, specialName, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end

類擴展(Extension)

1、類擴展是分類的一個特例(Extension 是 Category 的一個特例) ,也稱作匿名分類

2、可以給類添加成員屬性,但是是私有變量

3、可以給類添加方法,也是私有方法 (添加的方法一定要實現,Category 中的方法可以不實現)

4、一般情況下,Extension 是放在.m文件的@implementation 的上方

注:Extension 中的方法必須在@implementation中實現,否則會編譯出錯

分類(Category) 和 類擴展(Extension) 的區別:

Extension:

1、在編譯期間決議,是類的一部分,在編譯器和頭文件的@interface和實現文件裏的@implement一起形成一個完整的類

2、伴隨着類的產生而產生,也隨着類的消失而消失

3、Extension 一般用來隱藏類的私有信息,必須有一個類的源碼才能添加一個類的Extension ,所以對於系統的類,是無法添加類擴展

Category:

1、是運行時決議的

2、類擴展可以添加實例變量,分類不能添加實例變量,因爲在運行時期間,對象的內存佈局已經確定,如果添加實例變量會破壞類的內部佈局

發佈了84 篇原創文章 · 獲贊 23 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章