今天写程序的时候写了一个分类,我们都知道分类是在不改变原类的基础上添加新方法,却不能添加属性,若是添加了那么调用的时候就会崩溃,那么怎么办呢??我们利用运行时可以实现动态的给类增加属性
**扩展下:Gategory(分类/类别)
分类只能增加方法不能增加成员变量,可以声明属性,实际上会生成属性的set和get方法,但不会生成带下划线的成员变量.
若是在分类中用@property声明的属性,不会自动生成get /set方法的实现
标记是哪个关联的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并且关联对象使用原子性
};
完成后的整体代码如下:
.h文件
//分类的头文件
@interface ClassName (CategoryName)
@property (nonatomic, strong) NSString *str;
@end
.m文件
#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
{
/*
1.要被关联的对象
2.关联的key
*/
return objc_getAssociatedObject(self, &strKey);
}
@end
网友评论