iOS Runtime详解(新手也看得懂)

2020-01-21 07:51:57刘景俊

关联对象Runtime提供了下面几个接口:


//关联对象
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
//获取关联的对象
id objc_getAssociatedObject(id object, const void *key)
//移除关联的对象
void objc_removeAssociatedObjects(id object)

参数解释

id object:被关联的对象
const void *key:关联的key,要求唯一
id value:关联的对象
objc_AssociationPolicy policy:内存管理的策略

内存管理的策略


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. */
};

下面实现一个UIView的Category添加自定义属性defaultColor。


#import "ViewController.h"
#import "objc/runtime.h"

@interface UIView (DefaultColor)

@property (nonatomic, strong) UIColor *defaultColor;

@end

@implementation UIView (DefaultColor)

@dynamic defaultColor;

static char kDefaultColorKey;

- (void)setDefaultColor:(UIColor *)defaultColor {
 objc_setAssociatedObject(self, &kDefaultColorKey, defaultColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (id)defaultColor {
 return objc_getAssociatedObject(self, &kDefaultColorKey);
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.
 
 UIView *test = [UIView new];
 test.defaultColor = [UIColor blackColor];
 NSLog(@"%@", test.defaultColor);
}

@end