在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
};
网友评论