iOS通过rumtime给类别添加动态属性
2016-01-20 00:00
666 查看
看到交流群里有人在讨论categories能不能添加属性,想了想,iOS有runtime运行时的机制,应该是没问题的。然后查了下资料。解决方案整理如下:
先引入 objc/runtime.h
使用 objc_setAssociatedObject(id object,const void *key,id value,object_AssociationPolicy policy)
,objc_getAssociatedObject(id object,const void *key).动态添加属性跟获取属性。
例子:
先定义一个类
#import <UIKit/UIKit.h>
@interface Person:NSObject
@property(strong,nonatomic) NSString* name;
@end
@implementation Person
@end
定义一个类别
#import "Person.h"
@interface Person(Extention)
static char *PersonSexKey = "PersonSexKey";//定义常量,必须是C语言字符串
-(void)setSex:(NSString *)sex{
/*
OBJC_ASSOCIATION_ASSIGN;//assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC;//copy策略
OBJC_ASSOCIATION_RETAIN;
OBJC_ASSOCIATION_COPY;
objc_setAssociatedObject(id object,const void *key,id value,objc_AssociationPolicy)
参数说明:id object 给哪个对象进行添加属性
const void *key 添加属性的key
id value 设置属性值的value
objc_AssociationPolicy policy 属性策略
*/
objc_setAssociatedObject(self,PersonSexKey,sex,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)sex{
return objc_getAssociatedObject(self,PersonSexKey);
}
@end
P.S:NSString ,如果使用strong属性,则为指针赋值,当NSString对象被NSMutableString赋值时,NSString值会随着NSMutableString修改而修改。所以一般使用copy进行深拷贝。
先引入 objc/runtime.h
使用 objc_setAssociatedObject(id object,const void *key,id value,object_AssociationPolicy policy)
,objc_getAssociatedObject(id object,const void *key).动态添加属性跟获取属性。
例子:
先定义一个类
#import <UIKit/UIKit.h>
@interface Person:NSObject
@property(strong,nonatomic) NSString* name;
@end
@implementation Person
@end
定义一个类别
#import "Person.h"
@interface Person(Extention)
static char *PersonSexKey = "PersonSexKey";//定义常量,必须是C语言字符串
-(void)setSex:(NSString *)sex{
/*
OBJC_ASSOCIATION_ASSIGN;//assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC;//copy策略
OBJC_ASSOCIATION_RETAIN;
OBJC_ASSOCIATION_COPY;
objc_setAssociatedObject(id object,const void *key,id value,objc_AssociationPolicy)
参数说明:id object 给哪个对象进行添加属性
const void *key 添加属性的key
id value 设置属性值的value
objc_AssociationPolicy policy 属性策略
*/
objc_setAssociatedObject(self,PersonSexKey,sex,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)sex{
return objc_getAssociatedObject(self,PersonSexKey);
}
@end
P.S:NSString ,如果使用strong属性,则为指针赋值,当NSString对象被NSMutableString赋值时,NSString值会随着NSMutableString修改而修改。所以一般使用copy进行深拷贝。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- System 类 和 Runtime 类的常用用法介绍
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码