1、给分类添加属性

  • 需要引入objc/runtime.h头文件

    1. #import <objc/runtime.h>
  • 在分类的.h文件中添加属性

    1. @property (nonatomic, copy) NSString *name;
  • 在分类的.m文件中重写set/get方法 ```objectivec static NSString *nameKey = @”nameKey”;

  • (void)setName:(NSString *)name { objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC); }

  • (NSString *)name { return objc_getAssociatedObject(self, &nameKey); } ```

  • 对于Key的常见写法 ```objectivec //利用静态变量地址唯一不变的特性 1、static void *strKey = &strKey;

2、static NSString *strKey = @”strKey”;

3、static char strKey;

对于`objc_setAssociatedObject`第四个参数的枚举
```objectivec
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,          // 弱引用属性,对应assign,week类型属性
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, // 强引用,非原子性
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,  // copy,非原子性
    OBJC_ASSOCIATION_RETAIN = 01401,      // copy, 原子性
    OBJC_ASSOCIATION_COPY = 01403         // copy 原子性
};

2、分类的底层原理