iOS 分类增加属性

来源:互联网 发布:大数据 曾是规划 编辑:程序博客网 时间:2024/05/21 08:47

对于分类中 增加属性  我的建议是  如果是只读属性 那么可以在分类中使用 ,如果是可变属性 最好在 primary Class 中使用;不要在分类中使用。

代码如下:创建类 EOCPerson  。增加分类 分类中有属性

#import "EOCPerson.h"


@interface EOCPerson (AddProperty)


@property (nonatomic,strong)NSArray *families;


@property (nonatomic,strong,readonly)NSString *fatherName;


@property (nonatomic,strong)NSString *changName;

@end



#import "EOCPerson+AddProperty.h"

#import <objc/runtime.h>


static constchar * kFamiliesPropertyKey="kFamiliesPropertyKey";


@implementation EOCPerson (AddProperty)

@dynamic changName;



/**

 但是只读属性 不需要设置可以返回任意的值


 @return return value description

 */

- (NSString *)fatherName

{

    return@"Yang";

}


/*  第二种使用 运行时关联机制来使用 */

- (NSArray *)families

{

    returnobjc_getAssociatedObject(self,kFamiliesPropertyKey);

}


- (void)setFamilies:(NSArray *)families

{

    objc_setAssociatedObject(self,kFamiliesPropertyKey, families, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}



//- (void)setChangName:(NSString *)changName

//{

//    _

//}

//

//- (NSString *)changName

//{

//    return _changName;

//}


在 Xcode IDE 中我们发现 不论 _changName 这个选项根本无法出现。在 controller 中使用出现闪退 因为 并没有相应的方法 。不论 我们是否设置成了 @dynamic 我们需要使用

关联对象来设置 和 读取 相应的属性的值。 其实 在 iOS中 系统默认的 setter 和 getter 方法是有特殊的作用的 比如 你如果设置了KVO 的话 属性改变会 回到相关的方法 。但是 如果我们 用这种关联对象 发方式 改变属性值并不会  出发 KVO 。