这个的话并不是说 可以 在程序运行的时候 来几个 未知的东西 就添加什么 1 2 3 4 5的属性。而是可以在系统原有类的基础上 给那个类 集合实际的工程来添加你方便实用的东西。比如 一个 label 有 一个 backgroundcolor属性,我要给它添加一个 其他的 比如 文字 第一个字的color,那么就可以用这种技术了。
一下是从网上找的一个demo
- 首先定义一个类
#import@interface Person : NSObject
@property (assign, nonatomic) NSInteger age; -(void)run; @end #import "Person.h" @implementation Person -(void)run{ NSLog(@"%s",__func__); } @end
- 定义分类
#import "Person.h"
@interface Person (PersonExtention) @property (copy, nonatomic) NSString *name; -(void)saySex; @end #import "Person+PersonExtention.h" #import <objc/runtime.h> @implementation Person (PersonExtention) //定义常量 必须是C语言字符串 static char *PersonNameKey = "PersonNameKey"; -(void)setName:(NSString *)name{ /* OBJC_ASSOCIATION_ASSIGN; //assign策略 OBJC_ASSOCIATION_COPY_NONATOMIC; //copy策略 OBJC_ASSOCIATION_RETAIN_NONATOMIC; // retain策略 OBJC_ASSOCIATION_RETAIN; OBJC_ASSOCIATION_COPY; */ /* * id object 给哪个对象的属性赋值 const void *key 属性对应的key id value 设置属性值为value objc_AssociationPolicy policy 使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy); */ objc_setAssociatedObject(self, PersonNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC); } -(NSString *)name{ return objc_getAssociatedObject(self, PersonNameKey); } -(void)saySex{ NSLog(@"%s----%@",__func__,self); } @end
总结:在分类中@property不会生成_变量,也不会实现getter和setter方法,我们可以手动实现如下
-(NSString *)name{return @"name";
}
-(void)setName:(NSString *)name{ }
但是这样是没什么意义的,而且分类中不允许定义变量,所以只能用runtime类
欢迎大家 评论来 讨论 我的第一段见解是否正确