ios开发runtime学习四:动态添加属性
#import "ViewController.h"
#import "Person.h"
#import "NSObject+Property.h" /**
* 总结:1:动态添加属性:什么时候需要动态添加属性 开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方法 本质:动态添加属性,就是让某个属性与对象产生关联。runtime一般都是针对系统的类
2:让一个NSObject类 保存一个字符串:可以为系统的类写一个分类,属性定义某个变量:在分类中属性定义某个变量,则只会对该变量生成set,get方法的声明,不会生成实现,需要自己去写实现方法,也不会生成带下划线的成员变量。若要是想让外界访问该成员变量,1:可以在分类中用static定义全局变量,在get方法的实现中返回该成员变量 弊端:当该类销毁的时候,该属性的成员变量也不会销毁 2:在分类中利用runtime动态添加属性
*/ @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; NSObject *objc = [[NSObject alloc] init];
objc.name = @"";
NSLog(@"%@",objc.name); // 创建字符串对象
// NSString *str = [NSString stringWithString:@"123"];
//
// Person *p = [[Person alloc] init];
//
// p.name = str; } @end
#import <Foundation/Foundation.h> @interface NSObject (Property) /**
* 1:@property分类:只会生成get,set方法声明,不会生成实现,需要自己手动去生成实现方法,也不会生成下划线成员属性,可以用static定义下划线的成员变量在手动实现的get方法中返回,也可以用runtime实现动态添加属性
2:因为在分类中定义的属性不会生成下划线的成员变量,所以可以省略不写策略方式,只写定义就可以了@property NSString *name;
*/
@property NSString *name; @end
#import "NSObject+Property.h"
#import <objc/message.h>
/**
* 1:runtime动态添加属性: 1:为系统的类写分类,并属性定义变量,可以不写策略,并手动实现set和get方法
2:在set方法中可以利用runtime实现动态添加属性
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
object:给哪个对象添加属性
key:属性名称
value:属性值
policy:保存策略 2:在set方法中可以将该值取出来:objc_getAssociatedObject(self, @"name"); */
@implementation NSObject (Property) //static NSString *_name; - (void)setName:(NSString *)name
{
// 让这个字符串与当前对象产生联系 // _name = name;
// object:给哪个对象添加属性
// key:属性名称
// value:属性值
// policy:保存策略
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} - (NSString *)name
{
return objc_getAssociatedObject(self, @"name");
} @end
####4.给分类添加属性
* 原理:给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。
```
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 给系统NSObject类动态添加属性name
NSObject *objc = [[NSObject alloc] init];
objc.name = @"小码哥";
NSLog(@"%@",objc.name);
}
@end
// 定义关联的key
static const char *key = "name";
@implementation NSObject (Property)
- (NSString *)name
{
// 根据关联的key,获取关联的值。
return objc_getAssociatedObject(self, key);
}
- (void)setName:(NSString *)name
{
// 第一个参数:给哪个对象添加关联
// 第二个参数:关联的key,通过这个key获取
// 第三个参数:关联的value
// 第四个参数:关联的策略
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
ios开发runtime学习四:动态添加属性的更多相关文章
- ios开发runtime学习三:动态添加方法(实际应用少,面试)
#import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...
- iOS开发RunLoop学习:四:RunLoop的应用和RunLoop的面试题
一:RunLoop的应用 #import "ViewController.h" @interface ViewController () /** 注释 */ @property ( ...
- ios的runtime为什么可以动态添加方法
一句话概括 每个instance都有一个isa,这个isa,里面含有所有的方法列表,ios提供库函数增加,修改,即实现了动态添加方法
- ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型
一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...
- ios开发runtime学习二:runtime交换方法
#import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...
- iOS开发runtime学习:一:runtime简介与runtime的消息机制
一:runtime简介:也是面试必须会回答的部分 二:runtime的消息机制 #import "ViewController.h" #import <objc/messag ...
- ios开发网络学习四:NSURLConnection大文件断点下载
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...
- 我的Python学习笔记(四):动态添加属性和方法
一.动态语言与静态语言 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C ...
- Runtime(动态添加属性)
下面通过一个实例展示一下Runtime(动态添加属性)的用法 下面对运行时添加属性用到的策略参数进行补充: 这样看来,前面的NSString* name用的策略是retain nonatomic就知道 ...
随机推荐
- Java&Xml教程(九)Java中通过XSD校验XML合法性
Java XML校验API可以通过XSD(XML Schema Definition)校验XML文件内容的合法性. 在以下的案例中使用javax.xml.validation.Validator 类通 ...
- artDialog提示框、对话框
/** * 警告 * @param {String}消息内容 */ artDialog.alert = function (content, callback) { return artDialog( ...
- 50行python代码实现个代理server(你懂的)
之前遇到一个场景是这种: 我在自己的电脑上须要用mongodb图形client,可是mongodb的server地址没有对外网开放,仅仅能通过先登录主机A,然后再从A连接mongodbserverB. ...
- 深入了解Linux远程桌面
本文转载于:http://www.linux521.com/2009/system/201004/11001.html 已发表在<网管员世界>2010年3月杂志 本 ...
- JS 实现图片模态框,幻灯片,跑马灯功能
网站中常用的幻灯片和模态框,使用 HTML.JavaScript 与 CSS 来创建 Lightbox,类似相册预览功能.可以运用到视频网站,商城,相册上去 参考了菜鸟教程,有兴趣自己去看 HTML/ ...
- 【习题 7-7 UVA-12558】Egyptian Fractions (HARD version)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 迭代加深搜索. 枚举最大量maxdep 在dfs里面传剩余的要凑的分子.分母 以及上一次枚举的值是多少. 然后找到最小的k,满足1/ ...
- java8新增特性(二)----函数式接口(Functional)
上一篇博客介绍了java8新增的Lambda表达式,这一节介绍一下java8的函数式编程,两者之间有什么联系呢?请往下看~~~ Lambda表达式怎样在java类型中表示的呢? 语言设计者投入了大量的 ...
- 1. 初识ZooKeeper。
转自:https://blog.csdn.net/en_joker/article/details/78661466 Apache ZooKeeper是由 Apache Hadoop的子项目发展而来, ...
- 83.#pragma详解
创建数据段 //创建数据段 #pragma data_seg("fangfangdata") ; #pragma data_seg() 与数据段连接,实现数据通信,分享 //实现数 ...
- VUE错误记录 - 品牌后台练习 search(); 数组 splice forEach push 箭头函数
methods:{ add(){ var car = { id: this.id, name: this.name, ctime: new Date()}; this.list.push(car); ...