分類和擴(kuò)展

iOS 分類和擴(kuò)展

分類 Category

分類(Category)是OC中的特有語法,它是表示一個指向分類的結(jié)構(gòu)體的指針。原則上它只能增加方法,不能增加成員(實例)變量。

分類 Category 屬性和成員變量

在分類中可以寫@property, 但是不會生成setter/getter方法,也不會實現(xiàn)成員變量。如果強(qiáng)制使用會報錯。

不過可以通過runtime的關(guān)聯(lián)對象的方法在Category使用成員變量

新建PersonModel文件

// PersonModel.h@interfacePersonModel:NSObject@property(assign,nonatomic)intage;@end// PersonModel.m#import"PersonModel.h"@implementationPersonModel@end

為PersonModel創(chuàng)建Category

// PersonModel+Category.h@interfacePersonModel(Category)@property(copy,nonatomic)NSString*name;@property(copy,nonatomic)NSString*objName;@end// PersonModel+Category.m#import"PersonModel+Category.h"#importstaticNSString*objNameKey=@"objNameKey";@implementationPersonModel(Category)-(void)setObjName:(NSString*)objName{objc_setAssociatedObject(self,&objNameKey,objName,OBJC_ASSOCIATION_COPY_NONATOMIC);}-(NSString*)objName{returnobjc_getAssociatedObject(self,&objNameKey);}@end

使用

PersonModel*person=[PersonModel new];person.age=10;NSLog(@"person age = %d",person.age);// 復(fù)值失敗,因為Category只是添加了屬性,沒有添加成員變量//? ? person.name = @"jack";//? ? NSLog(@"person name = %@",person.name);person.objName=@"jack";NSLog(@"person objName = %@",person.objName);

返回

person age = 10person objName = jack

分類 Category 同名方法執(zhí)行順序

同名方法執(zhí)行順序為 分類 > 本類 > 父類

如果多個分類和本類有同名的方法,調(diào)用該方法的時候執(zhí)行由編譯器決定。

在RootController

-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];NSLog(@"name = %@",self);}

為RootController創(chuàng)建Category

-(void)viewWillAppear:(BOOL)animated{[superviewWillAppear:animated];NSLog(@"Category name = %@",self);}

返回

Category name=<RootController:0x12df0ec90>

擴(kuò)展

Extension:擴(kuò)展, 延展, 匿名分類;放在.m文件中。一般用于聲明私有屬性(不對子類暴露)、聲明私有方法、聲明私有成員變量。

創(chuàng)建PersonModel的Extension - PersonModel+Ex

@interfacePersonModel()@property(copy,nonatomic)NSString*exStr;-(void)exDemo;@end

在PersonModel.m里處理exStr和exDemo

-(void)exDemo{PersonModel*model=[PersonModelnew];model.exStr=@"Ex";NSLog(@"ex = %@",model.exStr);}

分類和擴(kuò)展的區(qū)別

分類(Category)擴(kuò)展(Extension)

運(yùn)行時決議編譯時決議

有單獨的.h和.m文件以聲明的方式存在,寄生于宿主類的.m文件

可以為系統(tǒng)類添加分類不能為系統(tǒng)類添加擴(kuò)展

看不到源碼的類可以添加分類沒有.m源碼的類無法為其添加擴(kuò)展

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容