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