1.分類Category
- 給原有類添加方法,類別中的方法沒被實(shí)現(xiàn)也不會有任何警告管怠,因?yàn)轭悇e是在運(yùn)行時添加到類中淆衷。
原則不能添加屬性或者成員變量,實(shí)際上可以通過runtime方式添加屬性或者成員變量
- 分類中可以寫@property, 但不會生成setter/getter方法, 也不會生成實(shí)現(xiàn)以及私有的成員變量(編譯時會報警告)渤弛。
可以通過runtime手動添加setter/getter方法
- 分類中可以訪問原有類.h中的屬性
- 如果分類中有和原有類同名的方法祝拯,優(yōu)先級是分類>原有類>原有類的父類
建立兩個文件:Person+category.h和Person+category.m
#import "Person.h"
@interface Person (category)
@property (nonatomic, strong) NSString *name;
(void)categoryMethod;
@end
#import <objc/runtime.h>
@implementation Person (category)
(void)categoryMethod{
//code}
//通過runtime手動添加setter/getter方法
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name{
return objc_getAssociatedObject(self, @selector(name));
}
注意:在原有類里使用下劃線_訪問分類中的屬性是訪問不到的,只能使用self訪問
2.類擴(kuò)展Extension
類擴(kuò)展Extension與分類相比少了實(shí)現(xiàn)文件她肯,我們稱之為匿名分類
- 為原有類添加新的屬性(成員變量)和方法
- 類擴(kuò)展的私有方法必須實(shí)現(xiàn)佳头,否則會發(fā)生警告,因?yàn)轭悢U(kuò)展是在編譯階段被添加到類中
- 類擴(kuò)展的私有方法在原有類的.m中實(shí)現(xiàn)
- 定義在 .m 文件中的類擴(kuò)展方法為私有的晴氨,定義在 .h 文件中的類擴(kuò)展方法為公有的
建立一個文件:Person_extension
#import "Person.h"
@interface Person ()
//私有屬性
@property (nonatomic, strong) NSString *cardId;
//私有方法
- (void)extensionMethod;
@end
在Person.m中
實(shí)現(xiàn)類擴(kuò)展的方法
-(void)extensionMethod{
//code
}
也可以這樣創(chuàng)建一個Extension,在.m文件中
@interface Person ()
- (void)extensionMethod2;
@end
這也是一個類擴(kuò)展
溫故而知新康嘉,常常寫下筆記也會有意想不到的作用。