目的
在 NSObject
類中,添加 name
屬性米死。
方案
利用 runtime
的相關(guān)方法:
- 動態(tài)添加屬性
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
objc_AssociationPolicy
相關(guān)枚舉值
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
- 獲得屬性
objc_getAssociatedObject(id object, const void *key);
- 移除所有關(guān)聯(lián)對象
objc_removeAssociatedObjects(id _Nonnull object);
實(shí)現(xiàn)
創(chuàng)建 NSObject
的分類 NSObject+DO
文件
NSObject+DO.h
文件:
#import <Foundation/Foundation.h>
@interface NSObject (DO)
/**
添加的 name 屬性
*/
@property (nonatomic, copy) NSString *name;
@end
NSObject+DO.m
文件:
#import <objc/message.h>
#import "NSObject+DO.h"
@implementation NSObject (DO)
- (void)setName:(NSString *)name
{
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name
{
return objc_getAssociatedObject(self, @"name");
}
@end
ViewController.m
文件:
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"張三";
NSLog(@"NSObject ---- name:%@", objc.name);
}
輸出結(jié)果:
NSObject ---- name:張三