一直搞不懂類擴展是什么東西,今天有時間,特意研究了一下,有誤之處還望博友指正。
category一般稱為分類又叫類別,是一種專門對某個類進行擴充的方法。但是其不能添加屬性,因為它是在運行時決定的,此時的類的內存布局已經確定,如果此時可以添加屬性
則勢必會破壞類的內存布局,帶來災難性的后果。既然提到了運行時,那就自然想到是否可以在運行時對分類進行添加屬性呢?答案:完全可以。
如下,見代碼:
@interface NSArray (runtime)
@PRoperty(nonatomic,strong)NSString * name;
@property(nonatomic,assign)int num;
@end
-(void)setName:(NSString *)name
{
objc_setAssociatedObject(self,@selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name
{
NSLog(@"%@",NSStringFromSelector(_cmd));
returnobjc_getAssociatedObject(self,_cmd);//_cmd實際為“name”
}
-(void)setNum:(int)num
{
//基本數據類型 與 對象 區別
NSValue * value = [NSValuevalue:&num withObjCType:@encode(int)];
objc_setAssociatedObject(self,@selector(num), value, OBJC_ASSOCIATION_RETAIN);
}
-(int)num
{
int cValue = {0};
NSValue * value =objc_getAssociatedObject(self,@selector(num));
[value getValue:&cValue];
return cValue;
}
extension一般稱為類擴展又名匿名類擴展,它既可以對類添加屬性又可以添加方法,實現均在implemetion中,它是在編譯時期決定的,一般用來隱藏類的私有消息(方法、屬性)。另,一般只有有源碼的類才會有類擴展,諸如系統的NSString 等類則是不能添加類擴展的。其實在每個人的日常編碼工作中,都經常用到類擴展,只是沒有一個全新的認識而已。代碼就不上了,很簡單的,請百度之。新聞熱點
疑難解答