原本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在那个系统的哪一个版本可使用,参数表示macOS
、iOS
、tvOS
、watchOS
、bridgeOS
五个操做系统在哪一个版本可使用此方法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) */
};
复制代码