原本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) */
};
複製代碼