Category
用于給class及其subclass添加新的方法
有自己單獨(dú)的 .h 和 .m 文件
用于添加新方法,而不能添加新屬性(property) 類別中增加了成員,編譯時(shí)可以通過,一切perfect? 等到運(yùn)行的時(shí)候會(huì)崩潰,會(huì)說找不到方法,類別中需要使用的成員放到 主文件中
主文件中可以self 直接調(diào)用類別的方法
為什么對類進(jìn)行擴(kuò)展的feature被稱作category虐杯?該名稱應(yīng)該反映了某種初衷剧防,那就是當(dāng)某個(gè)類比較復(fù)雜龐大時(shí)婶溯,我們可以對它的功能(也就是成員函數(shù))進(jìn)行分類淀歇,并且把它們放入不同的文件加以實(shí)現(xiàn)困鸥。
Extension
Objective-C 2.0之后增加了Extension借帘,所謂的擴(kuò)展,其實(shí)為一個(gè)類添加額外的方法或者屬性济蝉,這些方法和屬性是私有的杰刽。而我們又常常把Extension成為匿名的Category。類擴(kuò)展是在.m文件中聲明私有方法非常好的方式王滤。類擴(kuò)展中的聲明的方法與在類中聲明的方法是完全一致的贺嫂,需要在該類的@implementation中實(shí)現(xiàn),該方法只在該類內(nèi)部可見雁乡,對外不可見第喳。Extension常被稱為是匿名的Category
用于給類添加新方法,但只作用于原始類踱稍,不作用于subclass
只能對有implementation源代碼的類寫Extension曲饱,對于沒有implementation源代碼的類吩跋,比如framework class,是不可以的
Extension可以給原始類添加新方法渔工,以及新屬性
我們來簡單區(qū)分一下Category類別和Extension擴(kuò)展的區(qū)別:
(1)從某個(gè)類新建一個(gè)Category,會(huì)生成"類名稱+Category名稱".h和"類名稱+Category名稱".m兩個(gè)文件桥温;而從某個(gè)類新建一個(gè)Extension引矩,只會(huì)生成一個(gè)"類名稱_Extension.h"一個(gè)文件。
(2)Category中不可以定義屬性或者變量侵浸;而Extension中可以定義屬性或者變量旺韭。
(3)在Category中定義的方法可以被子類繼承;而Extension中定義的方法和屬性不能被子類繼承掏觉,因?yàn)樗鼈兪莗rivate的区端。
(4)Category可以對自定義的類或者framework框架中的類增加方法;而Extension只能對自定義的類進(jìn)行增加方法澳腹,因?yàn)槟銦o法在框架類的實(shí)現(xiàn)文件中實(shí)現(xiàn)這些增加的方法织盼,畢竟OC不是開源的,這些代碼不可見酱塔。
(5)Category的名字是@interface 類名(Category名稱)沥邻,@implementation 類名(Category名稱);而Extension名字只有@interface 類名();
(6)可以把Extension理解為特殊的Category;
以下就是Extension的應(yīng)用,項(xiàng)目中很多都會(huì)用的 ?
#import "Person.h"
//定義一個(gè)Extension羊娃;
@interface Person ()
//對于普通變量唐全,不能使用strong,retain,copy,只能使用assign;
@property(nonatomic,assign) int age;
//這是可以理解為private 類型的方法蕊玷;只可以在該類@implementation內(nèi)部調(diào)用邮利;對外部不可見;
- (void)printName;
- (void)printAge;
@end
//類的實(shí)現(xiàn)文件垃帅;
@implementation Person
- (instancetype)initWithName:(NSString*)aName{
//使用父類的方法來初始化對象延届;
self = [super init];
if (self) {
//設(shè)置該對象的屬性值;
self.name = aName;
self.age = 23;
}
//這里返回出去的是一個(gè)對象挺智;
return self;
}
- (void)print{
NSLog(@"Person print");
[self printName];
[self printAge];
}
//實(shí)現(xiàn)Extension中定義的方法祷愉;
- (void)printName{
NSLog(@"name:%@",self.name);
}
- (void)printAge{
NSLog(@"name:%d",self.age);
}
@end
參考鏈接:https://github.com/chenyufeng1991/Objective-C_Extension 和其他的一些網(wǎng)絡(luò)資源