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

四、

相關文章
相關標籤/搜索