通常在分類中只能聲明方法甫何,不能添加屬性變量,但是其實可以通過關聯(lián)對象(Objective-C Associated Objects)實現(xiàn)給分類添加屬性的。
首先,給分類添加屬性不會自動生成getter豪治、setter方法,需要使用關聯(lián)對象Runtime提供的這幾個接口來實現(xiàn)扯罐。
//添加關聯(lián)對象
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
//獲取關聯(lián)的對象
id objc_getAssociatedObject(id object, const void *key)
//移除關聯(lián)的對象
void objc_removeAssociatedObjects(id object)
- 參數(shù)解釋
id object:被關聯(lián)的對象
const void *key:關聯(lián)的key负拟,要求唯一
id value:關聯(lián)的對象
objc_AssociationPolicy policy:內(nèi)存管理的策略
- 內(nèi)存管理的策略
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.
* The association is not made atomically. */
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied.
* The association is not made atomically. */
OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object.
* The association is made atomically. */
OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied.
* The association is made atomically. */
};
內(nèi)存策略 | 屬性修飾 | 描述 |
---|---|---|
OBJC_ASSOCIATION_ASSIGN | @property (assign) 或 @property (unsafe_unretained) | 指定一個關聯(lián)對象的弱引用。 |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | @property (nonatomic, strong) | 指定一個關聯(lián)對象的強引用歹河,不能被原子化使用齿椅。 |
OBJC_ASSOCIATION_COPY_NONATOMIC | @property (nonatomic, copy) | 指定一個關聯(lián)對象的copy引用,不能被原子化使用启泣。 |
OBJC_ASSOCIATION_RETAIN | @property (atomic, strong) | 指定一個關聯(lián)對象的強引用,能被原子化使用示辈。 |
OBJC_ASSOCIATION_COPY | @property (atomic, copy) | 指定一個關聯(lián)對象的copy引用寥茫,能被原子化使用。 |
接下來矾麻,給UIView添加一個Color分類纱耻,并使用關聯(lián)對象RunTime給UIView添加一個屬性foregroundColor。
- 創(chuàng)建分類险耀,在.h文件中添加屬性弄喘。
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIView (Color)
@property (nonatomic, strong) UIColor *foregroundColor;
@end
NS_ASSUME_NONNULL_END
- 在.m文件中引入runtime頭文件,需要添加一個關聯(lián)對象時的用來標記對應的那個屬性的key甩牺,為了保證這個key唯一不變蘑志,使用靜態(tài)變量,有三種寫法贬派,效果是一樣的急但。
//靜態(tài)變量存儲地址唯一不變
static NSString *kForegroundColorKey = @"kForegroundColorKey";
static void *kForegroundColorKey = &kForegroundColorKey;
static char kForegroundColorKey;
- 添加屬性的getter、setter方法
#import "UIView+Color.h"
#import "objc/runtime.h"
@implementation UIView (Color)
static char kForegroundColorKey;
- (void)setForegroundColor:(UIColor *)foregroundColor{
objc_setAssociatedObject(self, &kForegroundColorKey, foregroundColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIColor *)foregroundColor {
return objc_getAssociatedObject(self, &kForegroundColorKey);
}
@end
- 使用
UIView * view = [[UIView alloc]init];
view.foregroundColor = [UIColor whiteColor];
UIColor * color = view.foregroundColor;