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就知道 ...
随机推荐
- Linux - 用 Konstruct 安装 KDE 3.x
make-kde3.x Linux - 用 Konstruct 安装 KDE 3.x 找个截图工具 khtml2png (http://khtml2png.sourceforge.net/), 现在都 ...
- css 兼容性前缀
一.不同浏览器内核下的书写规则 二:transform 具体变性中心基点 transform-origin 默认情况下 rotate旋转.scale缩放.translate位移.矩阵matri ...
- SQL数值转字符串保留指定小数位
IF EXISTS ( SELECT * FROM sysobjects WHERE xtype = 'fn' AND name = 'fn_NumberFormat' ) BEGIN DROP FU ...
- BZOJ3620: 似乎在梦中见过的样子(KMP)
Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发生的事.为了使 ...
- LAMP漫长编译安装
传说中的LAMP :Linux+Apache+MySQL+Python/Perl/PHP,Linux上安装方式:RPM和源码安装,源码安装要依赖包安装,可以定制安装 首先安装编译工具 yum inst ...
- python 命令行參数解析
本文是从我还有一个博客转载过来的,欢迎大家点击进去看一下,帮我添加点人气^_^ ImPyy 选择模块 依据python參考手冊的提示,optparse 已经废弃,应使用 argparse 教程 概念 ...
- Nginx详细编译参数
本参数基于Nginx-1.15.2安装包 一 路径参数 1.1.1 指定Nginx安装路径 --prefix=/usr/local/nginx- 1.1.2 设置Nginx可执行文件路径默认路径在 - ...
- 关于python的二维数组
test =[ [1, 2, 3], [4, 5, 6], [7, 8, 9]] #这个就可以看做是二维数组了,直接创建print(test)print(test[:][1]) ...
- trunc与round
TRUNC(number[,num_digits]) number 需要截尾取整的数字. num_digits 用于指定取整精度的数字.Num_digits 的默认值为 0. 作用:截断数字和时间 ...
- python分解质因数
将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. # !/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wa ...