在苹果的规定中分类(Category)中是不可以添加自定义属性的,
why?
- 1.分类为什么不能拓展成员变量?
- 使用alloc初始化的时候,一些系统自定义的类型都有固定的大小,因为他们都有系统定义的固有的成员变量,init就是为这些成员变量赋值
- 如果,我们在分类中拓展成员变量,那么使用alloc开辟空间的时候,就无法检测到自定义的成员变量,所以使用init开辟空间的时候就无法准确的开辟空间,所以苹果的设计中不允许在分类中扩展成员变量
凡事都有个例外………
通过运行时机制
可以实现在分类中添加自定义属性
NSObject+LC.h
@interface NSObject (LC)
@property (nonatomic,strong) id associatedObject;
@end
NSObject+LC.m
#import <objc/runtime.h>
/*
1.运行时,是开发OC的;OC是在运行时的C语言的API的基础之上的封装
2.可以动态的给对象增加属性 : 字典转模型框架
3.可以动态的交换方法的地址 : 可以交换自定义的方法和系统的方法的地址
4.可以动态的获取对象的属性 : 字典转模型框架
5.可以动态的给某个分类关联上它的属性
6.可以动态的给对象的私有的成员变量赋值
7.只在开发大型框架时使用的,平时开发用不到的
*/
@implementation NSObject (LC)
@dynamic LC;
/*
参数1 : 关联的对象
参数2 : 关联的key
参数3 : 关联的value
参数4 : 关联的value的存储策略
*/
-(void)setAssociatedObject: (id) object {
objc_setAssociatedObject ( self, @selector (associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
}
-(id)associatedObject{
return objc_getAssociatedObject( self, @selector ( associatedObject ) );