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什么区别?
强引用持有对象,而弱引用不持有对象。