分類(Category)是OC中的特有語法,它是表示一個指向分類的結構體的指針。原則上它只能增長方法,不能增長成員(實例)變量。bash
setter/getter
方法, 也不會生成實現以及私有的成員變量(編譯時會報警告);分類 > 本類 > 父類
。所以在開發中儘可能不要覆蓋原有類;_成員變量
和
setter/getter
,但分類的指針結構體中,根本沒有屬性列表。因此在分類中用@property聲明屬性,既沒法生成
_成員變量
也沒法生成
setter/getter
。
_成員變量
和
setter/getter
方法,報錯就在所不免了。
setter/getter
方法,可不能夠在手動添加
setter/getter
來避免崩潰,完成調用呢?
runtime
完成的,雖然系統不給咱們生成
setter/getter
,但咱們能夠經過
runtime
手動添加
setter/getter
方法。
#import <objc/runtime.h>
static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey"; //定義一個key值
@implementation Programmer (Category)
//運行時實現setter方法
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}
//運行時實現getter方法
- (NSString *)nameWithSetterGetter {
return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}
@end複製代碼
可是注意,以上代碼僅僅是手動實現了setter/getter
方法,但調用_成員變量
依然報錯。
ui
Extension是Category的一個特例。類擴展與分類相比只少了分類的名稱,因此稱之爲「匿名分類」。
其實開發當中,咱們幾乎每天在使用。對於有些人來講像是最熟悉的陌生人。spa
@interface XXX ()
//私有屬性
//私有方法(若是不實現,編譯時會報警,Method definition for 'XXX' not found)
@end複製代碼
爲一個類添加額外的原來沒有變量,方法和屬性
通常的類擴展寫到.m
文件中
通常的私有屬性寫到.m
文件中的類擴展中
指針
runtime
解決無setter/getter
的問題而已);