runtime简单使用之动态添加属性
来源:互联网 发布:vb菱形编程 编辑:程序博客网 时间:2024/04/26 03:27
runtime简单使用之给系统类动态添加属性
前言
1, 给类动态添加属性,实质就是让一个属性与某个对象产生关联的关系.值得注意的一点: 使用该功能的前提是给系统的类添加属性,如果是自定义的类添加属性,就没有必要用到runtime了.
2, 背景: 给系统的NSObject类动态添加一个name属性.
1, 创建NSObject对象
#import "ViewController.h"#import "NSObject+property.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; NSObject *objc = [[NSObject alloc] init]; objc.name = @"WilliamAlex"; NSLog(@"%@",objc.name);}@end
- 注意 : 如果直接定义一个WGPerson类,在WGPerson类中声明并实现name属性,这样添加属性直接添加就是了,没有必要使用runtime来动态添加.一般的做法是添加一个分类,在分类中声明一个name属性,然后手动写setter和getter方法,使用runtime保存name属性并与NSObject产生关联.
2, 创建一个分类
// 在分类中声明一个属性时,只会生成setter和getter方法的声明,并不能生成setter和getter方法的实现以及带下划线的成员变量.所以, 在分类中有两种方式声明一个属性// 第一种写法@property(nonatomic, strong) NSString *name;// 第二种写法 : 原因是在分类中声明属性只会生成setter和getter的声明@property NSString *name;
- 实现setter和getter方法
#import "NSObject+property.h"#import <objc/message.h>@implementation NSObject (property)- (void)setName:(NSString *)name{ // Associated : |əˈsəʊʃɪeɪt|关联的意思 /* 产生关联,让某个对象(name)与当前对象的属性(name)产生关联 参数1: id object :表示给哪个对象添加关联 参数2: const void *key : 表示: id类型的key值(以后用这个key来获取属性) 属性名 参数3: id value : 属性值 参数4: 策略, 是个枚举(点进去,解释很详细) */ objc_setAssociatedObject(self, "Alex", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSString *)name{ return objc_getAssociatedObject(self, "Alex");}// 下面是策略(是个枚举值)的类型OBJC_ASSOCIATION_ASSIGN = 0,< Specifies a weak reference to the associated object.OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,< Specifies a strong reference to the associated object. The association is not made atomically.OBJC_ASSOCIATION_COPY_NONATOMIC = 3,< Specifies that the associated object is copied. The association is not made atomicallyOBJC_ASSOCIATION_RETAIN = 01401,< Specifies a strong reference to the associated object. The association is made atomically.OBJC_ASSOCIATION_COPY = 01403< Specifies that the associated object is copied. The association is made atomically.@end
- 打印结果
2016-03-08 21:58:52.232 sasass[2172:73513] WilliamAlex
- 总结 :
问题 : 为什么我们会用runtime方法来给系统的类动态添加属性? 直接在分类的.m文件中定义一个全局的NSString *_name;也可以打印出结果啊!为什么不能那样做呢
- 具体实现
// 其他保持一样#import "NSObject+property.h"#import <objc/message.h>NSString *_name;@implementation NSObject (property)- (void)setName:(NSString *)name{ _name =name;}- (NSString *)name{ return _name;}@end
- 打印结果
2016-03-08 21:58:52.232 sasass[2172:73513] WilliamAlex
答 : 属性保存的地址不同,如果使用问题中所述的那样,虽然可以打印出结果,但是当objc销毁了,objc.name并不会随着它的销毁而销毁.这样就不是关联关系了.既然是添加属性,那么当objc销毁了,objc.name也需要随之销毁,如果直接在分类中实现setter和getter方法,虽然可以打印出字符串,但是并没有与之产生关联,所以这时候就需要使用东岸runtime,那么就需要将某个属性保存到条用它的对象里.给哪个对象添加属性,那么就将之保存到谁里面.
文/怪蜀黍Alex(简书作者)
原文链接:http://www.jianshu.com/p/e52c17db0aa9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/e52c17db0aa9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
0 0
- runtime简单使用之动态添加属性
- runtime动态添加属性
- Runtime 动态添加属性
- runtime -- 动态添加属性
- 动态添加属性(Runtime)
- Runtime之分类添加属性
- runtime跳转界面以及动态添加属性
- iOS (Category)runtime动态添加属性
- Runtime(动态添加属性)学习
- RunTime应用--动态给分类添加属性
- iOS:runtime的使用(动态添加方法、关联方法、交换方法、遍历私有属性)
- iOS Runtime 动态添加属性不能添加intrinsic类型
- Runtime之动态获取属性列表
- Runtime的使用7 【动态添加方法】
- Runtime-动态创建类添加属性和方法
- Runtime-动态创建类添加属性和方法
- iOS开发------runtime关联对象(动态添加属性)
- iOS分类中通过runtime添加动态属性
- UIScrollView的使用详解
- 明天(2016/5/1)晚上8:00-9:00在"webrtc源码分析群"qq群,开讲webrtc源码分析学习,欢迎有兴趣的同学可以来听听
- LA 3266 Tian Ji -- The Horse Racing (贪心 || DP)
- 深入理解Java虚拟机(一)-jvm运行时数据区
- Centos6.5的几种网络环境配置方法
- runtime简单使用之动态添加属性
- scapy实现arp 毒化攻击
- ajax实现保存功能
- OSChinaiOS客户端源码剖析001(架构篇)
- 【网页制作】——WEB标准三要素:html,css,javascrip
- 我的第一篇博客
- Spring事务——使用TransactionProxyFactoryBean创建事务代理
- 为何bash中一条命令的输出保存到变量之后换行符变成了空格
- Spring事务——Spring 2.X的事务配置策略