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ò)展