iOS给分类添加属性

671 阅读1分钟

一、相关知识介绍

本来category里边是不允许添加属性(也可以说是添加属性之后不会自动生成get、set方法)的,但是有时候我们又不得不添加属性,所以这里就用到了runtime类下的两个方法

#import <objc/runtime.h>
//给某个类添加属性赋值
/**
 * id object : 关联的对象
 * const void *key : 关联的key
 * id value : 给key赋值,通过将此值置为nil来清楚关联
 * objc_AssociationPolicy policy : 关联策略
 */
 
OBJC_EXPORT void
objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key,
                         id _Nullable value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0);
//获取某个类的属性的值
OBJC_EXPORT id _Nullable
objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0, 2.0);

1、OBJC_EXPORT

#if !defined(OBJC_EXPORT)
#   define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE
#endif

我觉得可以简单的理解为一个返回值,eg.OBJC_EXPORT void就代表没有返回值

2、OBJC_AVAILABLE

#if !defined(OBJC_AVAILABLE)
#   define OBJC_AVAILABLE(x, i, t, w, b)                            \
        __OSX_AVAILABLE(x)  __IOS_AVAILABLE(i)  __TVOS_AVAILABLE(t) \
        __WATCHOS_AVAILABLE(w)  
#endif

表示这个API在那个系统的哪个版本可以使用,参数表示macOSiOStvOSwatchOSbridgeOS五个操作系统在哪个版本可以使用此方法

3、objc_AssociationPolicy

从源码中可以看出该属性是一个枚举

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           /**等价于@property(assign)*/
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**等价于@property(nonatomic, strong) */
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**等价于@property(nonatomic, copy) */
    OBJC_ASSOCIATION_RETAIN = 01401,       /**等价于@property(atomic, strong) */
    OBJC_ASSOCIATION_COPY = 01403          /**等价于@property(atomic, copy) */
};

4、