博客> 使用runtime给Category添加属性
使用runtime给Category添加属性
2017-12-12 12:12 评论:0 阅读:673 tianya2416
属性 runtime Category

遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、setter方法。查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter、setter方法。有没有解决方案呢?有,通过运行时建立关联引用。接下来以添加一个这样的属性为例:

1、引入运行时头文件。

#import <objc>

2、在匿名分类或者头文件中添加属性

#import "CustomView.h"

@interface CustomView (CGView)
@property(nonatomic, copy) NSString * property;

- (void)outputproperty;

- (void)setProperty:(NSString *)propertys;
- (NSString *)property;

@end

3、在实现里面写要添加属性的getter、setter方法

#import "CustomView+CGView.h"
#import <objc>
@implementation CustomView (CGView)
//使用runtime的形式来给一个类别添加属性
- (void)setProperty:(NSString *)propertyName
{
    objc_setAssociatedObject(self,@selector(property), propertyName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)property
{
    return objc_getAssociatedObject(self, @selector(property));
}
- (void)outputproperty
{
    NSLog(@" CustomView (CGView) output : %@",self.property);
}
@end

在setStr:方法中使用了一个objc_setAssociatedObject的方法,这个方法有四个参数,分别是:源对象,关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),关联的对象和一个关联策略。

关联策略是个枚举值,解释如下:

enum { OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用

OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不使用原子性

OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使用原子性

OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性

OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性

}

收藏
0
sina weixin mail 回到顶部