談談Objective-C中分類和類擴展

1.分類Category

  • 給原有類添加方法,類別中的方法沒被實現也不會有任何警告,因為類別是在運行時添加到類中。
    原則不能添加屬性或者成員變量,實際上可以通過runtime方式添加屬性或者成員變量
  • 分類中可以寫@property, 但不會生成setter/getter方法, 也不會生成實現以及私有的成員變量(編譯時會報警告)。
    可以通過runtime手動添加setter/getter方法
  • 分類中可以訪問原有類.h中的屬性
  • 如果分類中有和原有類同名的方法,優先級是分類>原有類>原有類的父類

建立兩個文件: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.類擴展Extension

類擴展Extension與分類相比少了實現文件,我們稱之為匿名分類

  • 為原有類添加新的屬性(成員變量)和方法
  • 類擴展的私有方法必須實現,否則會發生警告,因為類擴展是在編譯階段被添加到類中
  • 類擴展的私有方法在原有類的.m中實現
  • 定義在 .m 文件中的類擴展方法為私有的,定義在 .h 文件中的類擴展方法為公有的

建立一個文件:Person_extension

#import "Person.h"

@interface Person ()
//私有屬性
@property (nonatomic, strong) NSString *cardId;
//私有方法
- (void)extensionMethod;

@end


在Person.m中

實現類擴展的方法
-(void)extensionMethod{
    //code
}

也可以這樣創建一個Extension,在.m文件中

@interface Person ()
- (void)extensionMethod2;
@end

這也是一個類擴展

溫故而知新,常常寫下筆記也會有意想不到的作用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容