iOS開發--Runtime的簡單使用之關聯對象,ios--runtime

來源:互聯網
上載者:User

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等等,我們也可以這樣做。

不妨去試試,寫一個屬於自己的工具類,快速效率的進行開發。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.