category
類別的作用
- 為任何類添加新的方法,包括那些沒有源代碼的類,達到擴充類的功能;
- 將類的實現分散到多個不同文件或多個不同框架中;
- 使用類別創建前向引用:如果其他類中的方法未實現,在你訪問其他類的私有方法時編譯器報錯,這時使用類別,在類別中聲明這些方法(不必提供方法實現),編譯器就不會再產生警告;
- 向對象添加非正式協議(所謂的非正式協議就是類別,即凡是NSObject或其子類的類別,都是非正式協議)。
類別的局限性
- 無法向類中添加新的實例變量,類別沒有位置容納實例變量。
- 名稱沖突,即當類別中的方法與原始類方法名稱沖突時,類別具有更高的優先級。類別方法將完全取代初始方法從而無法再使用初始方法
補充
objc runtime 動態增加屬性
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
objc_setAssociatedObject
objc_setAssociatedObject(self, @selector(NoAutoSizing), @(NoAutoSizing), OBJC_ASSOCIATION_RETAIN);
方法總共四個參數,分別是綁定目標,關鍵字,綁定者,策略。
綁定目標,就是給誰綁定;
關鍵字就是給這個對象綁定一個屬性,要有一個標示符去表示那個屬性,調用這個屬性的時候通過標示符去尋找這個屬性;
綁定者,要為這個屬性綁定的值;
策略就是說綁定的這個屬性的引用機制。
objc_getAssociatedObject
兩個參數,一個綁定目標,一個關鍵字,通過關鍵字從綁定目標中獲取屬性的值。
舉例:
#import <UIKit/UIKit.h>
@interface UILabel (Associate)
- (void) setFlashColor:(UIColor *) flashColor;
- (UIColor *) getFlashColor;
@end
#import "UILabel+Associate.h"
#import <objc/runtime.h>
@implementation UILabel (Associate)
static char flashColorKey;
- (void) setFlashColor:(UIColor *) flashColor{
objc_setAssociatedObject(self, &flashColorKey, flashColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIColor *) getFlashColor{
return objc_getAssociatedObject(self, &flashColorKey);
}
@end
UILabel *lab = [[UILabel alloc] init];
[lab setFlashColor:[UIColor redColor]];
NSLog(@"%@", [lab getFlashColor]);