iOS開發--Runtime的簡單使用之關聯對象,ios--runtime
一、Runtime關聯對象的方法簡介:
在<objc/runtime.h>中,有三個關聯的方法,分別是:
objc_setAssociatedObjectobjc_getAssociatedObjectobjc_removeAssociatedObjects
1.1、設定關聯
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
第一個參數:id object : 表示關聯的來源物件
第二個參數:const void *key : 擷取被關聯者的索引key
第三個參數:id value : 被關聯者
第四個參數:objc_AssociationPolicy policy : 關聯策略,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC
objc_AssociationPolicy是一個枚舉類型,一共為5種:
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */ OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. * The association is not made atomically. */ OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. * The association is not made atomically. */ OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. * The association is made atomically. */ OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. * The association is made atomically. */};
1.2、擷取關聯
id objc_getAssociatedObject(id object, const void *key)
同上:
第一個參數:id object : 表示關聯的來源物件
第二個參數:const void *key : 擷取被關聯者的索引key
1.3、移除關聯
void objc_removeAssociatedObjects(id object)
只有一個參數id object,是關聯的來源物件。作用就是移除object的所有關聯。
二、Runtime關聯對象的簡單應用:
下面以UIButton為例,使用關聯對象完成一個功能函數:為UIButton增加一個Category,定義一個方法,使用block去實現button的點擊回調。
UIButton+Addition.h
#import <UIKit/UIKit.h>#import <objc/runtime.h> // 匯入標頭檔// 聲明一個button點擊事件的回調blocktypedef void(^ButtonClickCallBack)(UIButton *button);@interface UIButton (Addition)// 為UIButton增加的回調方法- (void)handleClickCallBack:(ButtonClickCallBack)callBack;@end
UIButton+Addition.m
#import "UIButton+Addition.h"// 聲明一個靜態索引key,用於擷取被關聯對象的值static char *buttonClickKey;@implementation UIButton (Addition)- (void)handleClickCallBack:(ButtonClickCallBack)callBack { // 將button的執行個體與回調的block通過索引key進行關聯: objc_setAssociatedObject(self, &buttonClickKey, callBack, OBJC_ASSOCIATION_RETAIN_NONATOMIC); // 設定button執行的方法 [self addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];}- (void)buttonClicked { // 通過靜態索引key,擷取被關聯對象(這裡就是回調的block) ButtonClickCallBack callBack = objc_getAssociatedObject(self, &buttonClickKey); if (callBack) { callBack(self); }}@end
在UIViewController中,匯入我們寫好的UIButton分類標頭檔,定義一個button對象,調用分類中的這個方法:
[self.testButton handleClickCallBack:^(UIButton *button) { NSLog(@"click...");
}];
以上我們完成了runtime關聯對象的簡單使用,對於UIButton一般的點擊事件而言,我們可以在block回調中進行對點擊事件的處理,而不用再去調用:
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
這樣做,提高了我們的開發效率。對於UIView、UIAlertView等等,我們也可以這樣做。
不妨去試試,寫一個屬於自己的工具類,快速效率的進行開發。