在介紹Category和Extension之前我們先說下屬性和成員變量。
屬性:我們使用 property聲明的,如下代碼
@interface People ()
@property (nonatomic, strong) NSString *ageS;
@end
成員變量:我們寫在{}中的,如下代碼
@implementation People{
NSString *adress;//聲明一個成員變量
}
或者
@interface People (){
NSString *email;//聲明一個成員變量
}
@property (nonatomic, strong) NSString *ageS;
@end
Category類別(類目)
什么是Category?
Category:是Objective-C 2.0之后添加的語言特性,類目、類別說的都是category。
主要作用是為已有的類添加方法??梢远嗳藢ν粋€類添加不同的業(yè)務(wù)處理方法,同步開發(fā),互不影響。
形式:有.h和.m文件,類名+(類別名)這種樣式。
category特點(diǎn)
- 有實(shí)現(xiàn)文件,即.m
- 不能直接添加屬性。因?yàn)閏ategory不能自動生成set和get方法,需要我們自己添加,生成代碼下面會介紹
- 不能添加成員變量
- 如果定義的方法名和類中原有方法名稱一直,會執(zhí)行category定義的方法
- 如果定義了兩個category,里面有方法名稱一直,那運(yùn)行時會執(zhí)行最后編譯的那個category對應(yīng)的方法。
category如何定義屬性
因?yàn)閏ategory不能直接定義屬性,需要我們自己添加set和get方法。代碼如下:
.h文件中添加屬性
@interface People (CategoryTest)
@property (nonatomic, strong) NSString *name;
@end
.m中添加set和get方法。需要使用runtime,如下
- (void)setName:(NSString * _Nonnull) name{
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *) name{
return objc_getAssociatedObject(self, @selector(name));
}
Extension擴(kuò)展
什么是Extension
extension擴(kuò)展:在已有的類中添加屬性、方法、成員變量。擴(kuò)展、延展指的都是extension。
主要作用是為類添加屬性、方法、成員變量。
形式:只有.h文件,類名+()這種樣式。如下
@interface People ()
@property (nonatomic, strong) NSString *ageS;
@end
大家看到上面這種形式是不是感覺很熟悉。就是我們經(jīng)常在.m里面直接添加的,用來聲明私有的方法或者屬性。
extension特點(diǎn)
- 可以生成屬性、方法、成員變量
- 只有.h文件。不能單獨(dú)使用,必須寄生在原有類中才可以使用。
- 只定義,不實(shí)現(xiàn)。
category和extension的區(qū)別
從上面他們兩個的特點(diǎn)我們就可以總結(jié)category和extension的區(qū)別,如下:
- 外形上不同。category既有聲明文件又有實(shí)現(xiàn)文件,extension只有聲明文件
- category不能直接添加屬性,extension可以直接添加屬性
- category不能添加成員變量,extension可以
- category不用寄生原有類中,extension必須寄生在原有類中,實(shí)現(xiàn)聲明的方法或者屬性
- category是在運(yùn)行時決定的,extension是編譯時