iOS给分类添加属性

1、相关知识介绍

原本category里边是不容许添加属性(也能够说是添加属性以后不会自动生成get、set方法)的,可是有时候咱们又不得不添加属性,因此这里就用到了runtime类下的两个方法bash

#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);
复制代码

一、OBJC_EXPORT

#if !defined(OBJC_EXPORT)
# define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE
#endif
复制代码

我以为能够简单的理解为一个返回值,eg.OBJC_EXPORT void就表明没有返回值ui

二、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五个操做系统在哪一个版本可使用此方法atom

三、objc_AssociationPolicy

从源码中能够看出该属性是一个枚举spa

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) */
};
复制代码

四、

相关文章
相关标签/搜索