关联对象(Objective-C Associated Obje

2023-04-25  本文已影响0人  一个半吊子工程师

在iOS开发中,我们经常使用到category,使用category可以给类添加方法或者属性

@interface Person (Property)
@property(nonatomic, strong) NSString *str;
@end

在添加属性的时候,如果仅仅声明属性,编译器并不会自动生成set和get方法,此时直接使用属性进行读写会发生crash,如下:


image.png

此时需要通过关联对象来增加属性的set和get方法实现。

#import "Person+Property.h"
#import <objc/runtime.h>
@implementation Person (Property)
- (void)setStr:(NSString *)str
{
    objc_setAssociatedObject(self, @selector(str), str, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)str
{
    return objc_getAssociatedObject(self, @selector(str));
}
@end

解释:
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)参数解释:
1、object:需要关联的对象
2、key:关联key
3、value:关联值
4、policy:关联策略

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
OBJC_ASSOCIATION_ASSIGN = 0, // 对应 assign       
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //  对应 strong,nonatomic
OBJC_ASSOCIATION_COPY_NONATOMIC = 3, // 对应 copy,nonatomic 
OBJC_ASSOCIATION_RETAIN = 01401, // 对应 strong,atomic                                     
OBJC_ASSOCIATION_COPY = 01403 // 对应 copy,atomic
};
上一篇下一篇

猜你喜欢

热点阅读