iOS 使用Runtime给UIButton添加属性

Object-c动态语言特点。创建UIButton分类。

.h文件代码如下:

//

//  UIButton+MyButton.h

//  Runtime分类添加属性

//

#import

NS_ASSUME_NONNULL_BEGIN

@interfaceUIButton(MyButton)

@property (nonatomic,assign)NSInteger myValue;

@end

NS_ASSUME_NONNULL_END

.m文件

//

//  UIButton+MyButton.m

//  Runtime分类添加属性

//

#import "UIButton+MyButton.h"

#import

static const char * MYVALUE = "MYVALUE";

@implementation UIButton (MyButton)

- (void)setMyValue:(NSInteger)myValue{

    objc_setAssociatedObject(self, MYVALUE,@(myValue), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (NSInteger)myValue{


    return [objc_getAssociatedObject(self, MYVALUE) integerValue];

}

@end

关于:objc_setAssociatedObject方法参数:

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

id object                    :表示关联者,是一个对象,变量名理所当然也是object

const void *key        :获取被关联者的索引key

id value                      :被关联者,这里是一个block

objc_AssociationPolicy policy : 关联时采用的协议,有assign,retain,copy等协议,一般使用OBJC_ASSOCIATION_RETAIN_NONATOMIC

其他字段:

typedefOBJC_ENUM(uintptr_t, objc_AssociationPolicy) {

    OBJC_ASSOCIATION_ASSIGN = 0,          /**指定对关联对象的弱引用 */

    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,/**指定对关联对象的强引用。这种联系不是原子性的。*/

    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,  /**指定复制关联对象。这种联系不是原子性的。*/

    OBJC_ASSOCIATION_RETAIN = 01401,      /**指定对关联对象的强引用。这种联系是原子性的。*/

    OBJC_ASSOCIATION_COPY = 01403          /**指定复制关联对象。这种联系是原子性的。*/

};

atmoic/nonatmoic是什么?

atmoic:原子属性,为系统默认的属性,会为修饰的成员变量的setter方法自动加锁(自旋锁),使得线程安全,但较为消耗资源,效率相对低些。是一种单写多度的多线程技术,可能出现脏数据。

nonatomic:非原子属性,开发中最常用的属性,不会为修饰的成员变量的setter方法加锁,虽然线程不安全,但效率高

__strong/__weak什么区别?

强引用持有对象,而弱引用不持有对象。

你可能感兴趣的:(iOS 使用Runtime给UIButton添加属性)