category类别中添加属性

博主文章链接:http://www.jianshu.com/p/935142af6a47

//1.不能添加的原因

首先, 使用@property的时候,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,属性相当于一个成员变量加getter和setter方法。

但是,在类别添加属性,  此时person类里并没有添加带“_”的成员变量,也没有实现setter和getter方法,只是在属性列表里添加了height属性。并且此时如果在控制器里调用self.height,程序运行时会报错,显示找不到该方法

//综上\成员变量是一个类的东西,分类本身就不是一个类,分类本来就是OC里面通过运行时动态的为一个类添加的一些方法和属性等,不是一个真正的类,它并没有自己的ISA,类最开始生成了很多基本属性,比如IvarList,MethodList,分类只会将自己的method attach到主类,并不会影响到主类的IvarList。这就是为什么分类里面不能增加成员变量的原因。

 

 

//2.添加的方法

#import <objc/runtime.h>

@interface HeartView (testProperty)

 

@property(nonatomic,copy)NSString *str ;

@property (nonatomic, copy) NSString *height;

 

@end

 

static void *strKey = &strKey;

 

@implementation HeartView (testProperty)

 

-(void)setStr:(NSString *)str

{

    objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

//objc_setAssociatedObject(self, @"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC);//方式2

 

}

 

-(NSString *)str

{

    return objc_getAssociatedObject(self, &strKey);

// return objc_getAssociatedObject(self, @"height");

}

 

@end

 

 

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

//

////利用静态变量地址唯一不变的特性

//1static void *strKey = &strKey;

//

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

//

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

//};

原文地址:https://www.cnblogs.com/daxueshan/p/6418329.html