Runtime的简单使用之关联对象,使用runtime关联对象

一、添加属性

iOS开发--Runtime的简单使用之关联对象,ios--runtime

一、Runtime关联对象的方法简介:

在<objc/runtime.h>中,有三个关联的方法,分别是:

objc_setAssociatedObject

objc_getAssociatedObject

objc_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点击事件的回调block
typedef 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等等,我们也可以这样做。

不妨去试试,写一个属于自己的工具类,快速效率的进行开发。

一、Runtime关联对象的方法简介: 在objc/runtime.h中 ,有三个关联的方法,分别是: objc_set...

一、Runtime关联对象的方法简介:

一、Runtime关联对象的方法简介:

在使用类别时可以直接添加方法,不能直接添加属性,但是可以利用runtime中关联对象的方法添加属性。主要的两个方法:

在<objc/runtime.h>中,有三个关联的方法,分别是:

在<objc/runtime.h>中,有三个关联的方法,分别是:

1、objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)此方法使用key做标识设置关联对象,参数解释如下:

objc_setAssociatedObject

objc_getAssociatedObject

objc_removeAssociatedObjects
objc_setAssociatedObject

objc_getAssociatedObject

objc_removeAssociatedObjects

id object关联对象;const void * key获取被关联者的索引key;

 

 

id value被关联者;

1.1、设置关联

1.1、设置关联

objc_AssociationPolicy policy关联时采用的协议,根据需求设置不同的协议,可以直接点进去查看,有retain,copy,assgin等类型。

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

2、objc_getAssociatedObject(id object, const void *key)此方法根据key获取关联对象

第一个参数:id object : 表示关联的源对象
第二个参数:const void *key : 获取被关联者的索引key
第三个参数:id value : 被关联者
第四个参数:objc_AssociationPolicy policy : 关联策略,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC

第一个参数:id object : 表示关联的源对象
第二个参数:const void *key : 获取被关联者的索引key
第三个参数:id value : 被关联者
第四个参数:objc_AssociationPolicy policy : 关联策略,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC

id object关联对象;const void * key获取被关联者的索引key;

objc_AssociationPolicy是一个枚举类型,一共为5种:

objc_AssociationPolicy是一个枚举类型,一共为5种:

方法介绍完,下面实例。如果创建了一个UIViewController的分类,想要在里面添加设置placeHolder占位图view,但是VC没有这个属性,我们就可以使用runtime通过关联对象的方式实现。

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. */
};
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实例

 

 

如图,第一和第二个方法通过ZYPlaceHolderView这个key关联添加的属性。第三和第四个方法通过对属性自动生成set和get方法而实现。

1.2、获取关联

1.2、获取关联

这样可以在VC内直接使用self.placeHolderView和self.index这两个属性。

id objc_getAssociatedObject(id object, const void *key)
id objc_getAssociatedObject(id object, const void *key)

二、关联对象

同上:

同上:

图片 2关联block,为alertVIew添加block点击事件

第一个参数:id object : 表示关联的源对象
第二个参数:const void *key : 获取被关联者的索引key

第一个参数:id object : 表示关联的源对象
第二个参数:const void *key : 获取被关联者的索引key

显示alert时,把代理的点击事件绑定到关联的block上面,这样以block的形式处理点击事件。

 

 

1.3、移除关联

1.3、移除关联

void objc_removeAssociatedObjects(id object)
void objc_removeAssociatedObjects(id object)

只有一个参数id object,是关联的源对象。作用就是移除object的所有关联。

只有一个参数id object,是关联的源对象。作用就是移除object的所有关联。

 

 

二、Runtime关联对象的简单应用:

二、Runtime关联对象的简单应用:

下面以UIButton为例,使用关联对象完成一个功能函数:为UIButton增加一个Category,定义一个方法,使用block去实现button的点击回调。

下面以UIButton为例,使用关联对象完成一个功能函数:为UIButton增加一个Category,定义一个方法,使用block去实现button的点击回调。

UIButton Addition.h

UIButton Addition.h

#import <UIKit/UIKit.h>
#import <objc/runtime.h>    // 导入头文件

// 声明一个button点击事件的回调block
typedef void(^ButtonClickCallBack)(UIButton *button);
@interface UIButton (Addition)

// 为UIButton增加的回调方法
- (void)handleClickCallBack:(ButtonClickCallBack)callBack;

@end
#import <UIKit/UIKit.h>
#import <objc/runtime.h>    // 导入头文件

// 声明一个button点击事件的回调block
typedef void(^ButtonClickCallBack)(UIButton *button);
@interface UIButton (Addition)

// 为UIButton增加的回调方法
- (void)handleClickCallBack:(ButtonClickCallBack)callBack;

@end

 

 

UIButton Addition.m

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
#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对象,调用分类中的这个方法:

在UIViewController中,导入我们写好的UIButton分类头文件,定义一个button对象,调用分类中的这个方法:

[self.testButton handleClickCallBack:^(UIButton *button) {
        NSLog(@"click...");
}];
[self.testButton handleClickCallBack:^(UIButton *button) {
        NSLog(@"click...");
}];

 

 

以上我们完成了runtime关联对象的简单使用,对于UIButton一般的点击事件而言,我们可以在block回调中进行对点击事件的处理,而不用再去调用:

以上我们完成了runtime关联对象的简单使用,对于UIButton一般的点击事件而言,我们可以在block回调中进行对点击事件的处理,而不用再去调用:

- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

这样做,提高了我们的开发效率。对于UIView、UIAlertView等等,我们也可以这样做。

这样做,提高了我们的开发效率。对于UIView、UIAlertView等等,我们也可以这样做。

不妨去试试,写一个属于自己的工具类,快速效率的进行开发。

不妨去试试,写一个属于自己的工具类,快速效率的进行开发。

本文由星彩网app下载发布于计算机编程,转载请注明出处:Runtime的简单使用之关联对象,使用runtime关联对象

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。