给分类(Category)添加属性

类别添加属性,虽然知道,但是用的比较少,经常忘记,这里记录一下.[看原作者][1]
[1]:http://www.jianshu.com/p/3cbab68fb856
OC的分类允许给分类添加属性,但不会自动生成getter、setter方法。有没有解决方案呢?有,通过运行时建立关联引用。接下来以添加一个这样的属性为例:

@property (nonatomic, copy) NSString *str;

1、引入运行时头文件。
#import <objc/runtime.h>
2、在匿名分类或者头文件中添加属性。区别是:匿名分类中添加的是私有属性,只在本类中可以使用,类的实例中不可以使用。头文件中添加的在类的实例中也可以使用。

分类的头文件
@interface ClassName (CategoryName)
//我要添加一个实例也可以访问的变量所以就写在这里了
@property (nonatomic, strong) NSString *str;
@end

//匿名分类
@interface ClassName ()

@end

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

@implementation ClassName (CategoryName) 

-(void)setStr:(NSString *)str  
 {  
objc_setAssociatedObject(self, &strKey, str,   OBJC_ASSOCIATION_COPY);  
}  

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

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

用来标记是哪一个属性的key常见有三种写法,但代码效果是一样的,如下:

  //利用静态变量地址唯一不变的特性
1、static void *strKey = &strKey;

 2、static NSString *strKey = @"strKey"; 

 3、static char strKey;

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

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并且关联对象使用原子性

};

4、完成后的整体代码如下
.h文件

 //分类的头文件
@interface ClassName (CategoryName)
@property (nonatomic, strong) NSString *str;
@end

.m文件

   //实现文件
#import "ClassName + CategoryName.h"
#import <objc/runtime.h>

static void *strKey = &strKey;

@implementation ClassName (CategoryName) 
-(void)setStr:(NSString *)str  
{  
objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);  
}  

-(NSString *)str  
{  
return objc_getAssociatedObject(self, &strKey);  
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、sett...
    碧霄问鼎阅读 36,307评论 25 129
  • 一、问题:给分类(category)添加属性 最近遇到一个问题:需要在一个类的Category中添加属性; 可以通...
    Jixin阅读 10,773评论 2 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 身心健康,快乐长寿,童颜不老青春永驻,是人类永恒的主题,更是当今社会的崇尚。如何保持健康快乐的身心,除了有一个平常...
    天涯佳音阅读 713评论 0 0
  • 每当想起不久前,我站在医生诊疗室外,看着墙上的显示屏,我的名字出现在重症患者一栏,我又开始头痛欲裂、全身酸软。 我...
    秋_4c28阅读 1,168评论 2 3