文档章节

runtime讲解<三>

刀客445
 刀客445
发布于 2016/05/21 15:00
字数 606
阅读 12
收藏 0
点赞 2
评论 0

1.访问私有变量

前面说过KVC可以设置私有变量的值,runtime同样可以。苹果没有真正意义上的私有变量

首先创建个model类

@interface Person ()
{
	NSString *name;
}


@end

创建私有变量name

现在我想在外面访问这个name,并给其赋值,读取到值

	Person *person = [[Person alloc] init];
	Ivar *ivars = class_copyIvarList([Person class], &count);
	for (int i = 0; i<count; i++) {
		Ivar ivar = ivars[i];
		//获取变量名
		const char *varName = ivar_getName(ivar);
		//获取变量类型
		const char *type = ivar_getTypeEncoding(ivar);
//		NSLog(@"%s  -- %s", varName, type);
		NSString *name = [NSString stringWithUTF8String:varName];
		if ([name isEqualToString:@"name"]) {
			//设置变量的值
			object_setIvar(person, ivar, @"xiaoming");
			//读取到变量的值
			NSLog(@"%@", object_getIvar(person, ivar));
		}
		
	}

2.给分类(类目)添加属性

原理:给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类内存空间

//定义关联的key
static const char *key = "sex";

@implementation Person (Property)
- (NSString *)sex
{
	//根据关联的key,获得关联的值
	return objc_getAssociatedObject(self, key);
}

- (void)setSex:(NSString *)sex
{
	
	//第一个参数:给那个对象添加关联
	//第二个参数:关联的key,通过这个key获取
	//第三个参数:关联的value
	//第四个参数:关联的策略
	objc_setAssociatedObject(self, key, sex, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
	
}

当然方法在h进行声明

Person *person = [[Person alloc] init];
	person.sex = @"男";
	NSLog(@"%@", person.sex);

当然还可以添加方法,自己研究去吧

3 动态交换方法

比如要实现占位图的功能,在没有图片时始终显示占位图

@implementation UIImage (Extension)


//这里说明一下load方法,它是在类被引用时就会调用,和initialize有区别,initialize是在类或者其子类的第一个方法被调用前调用,所有即使类文件被引用,但是没有使用,那么initialize也不会被调用
+ (void)load
{
	//交换方法
	
   //获得imageWithName方法地址
	Method imageWithName = class_getClassMethod(self, @selector(imageWithName:));
	
	//获得imageNamed方法地址
	Method imageName = class_getClassMethod(self, @selector(imageNamed:));
	
	//交换方法地址,相当于交换实现方式
	method_exchangeImplementations(imageWithName, imageName);
	
}


+ (instancetype)imageWithName:(NSString *)name
{
	
	//这里调用imageWithName,相当于调用imageNamed
	UIImage *image = [self imageWithName:name];
	if (image == nil) {
		
		image = [self imageWithName:@"1.jpg"];
//		NSLog(@"加载空的图片");
		
	}
	
	return image;
}
//这里调用imageNamed方法实际上执行的是imageWithName方法,而在imageWithName里面又调用imageWithName方法实际上调用的是imageNamed的方法,也就是说两个方法的实现交换了
UIImage *image = [UIImage imageNamed:@"12"];
	_imageView.image = image;

© 著作权归作者所有

共有 人打赏支持
刀客445
粉丝 2
博文 47
码字总数 10222
作品 0
杭州
LeadTools Android 入门教学——运行第一个Android Demo

LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一个Android Demo,我想...

葡萄城控件技术团队
2015/03/26
0
0
Runtime的使用——利用Runtime将字典转成Model

关于runtime的知识已经有很多的讲解(传送门:对runtime的理解 http://www.jianshu.com/p/927c8384855a),但一直不知道runtime的使用场景, 接下来利用runtime实现将字典转换成model。希望大家...

啪神
2016/03/25
103
0
玩转iOS开发:装逼技术RunTime的应用(一)

文章分享至我的个人技术博客:cainrun.github.io/15065147177… 前面我们把的一些基本知识都了解了一遍, 知道了在的方法调用是属于消息传送的机制. 接着呢, 我们知道了每个类都有一个的结构体...

CainLuo
2017/10/13
0
0
weblogic安装说明

因公司开发要求需安装weblogic服务做压力测试使用 安装步骤开始讲解 一.首先安装jdk 二.其次weblogic 三.步骤 1.创建用户加入到weblogic及root(后续有些执行权限问题即需要加入到root组) ...

暖暖miss
2017/09/04
0
0
Vue2 源码漫游(一)

Vue2 源码漫游(一) 描述: 一、代码主线 文件结构1-->4,代码执行顺序4-->1 1.platforms/web/entry-runtime.js/index.js web不同平台入口; 2.runtime/index.js 为Vue配置一些属性方法 3....

daipeng7
2017/11/17
0
0
J2EE学习tomcat

一 tomcat 介绍: 1.Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持...

watertiger
2016/12/20
6
0
runtime讲解

1.runtime是什么? runtime直译就是运行时间,run(跑,运行) time(时间),网上大家都叫它运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了很多底层的C语言API,它是OC的幕后工作者,...

刀客445
2016/05/19
56
0
runtime讲解

runtime的应用(1) 前面对runtime有了一个简单了解,可看了半天在应用在没什么用啊,那你就错了 啊,我想起来了,你前面不就要说应用吗,为毛等到现在,我还傻傻看完前一页,流量啊,其实我...

刀客445
2016/05/19
38
0
Swift 中的 Runtime

即使在 Swift APP 中没有一行 Object-c 的代码,每个 APP 也都会在 Object-c runtime 中运行,为动态任务分发和运行时对象关联开启了一个世界。更确切地说,可能在仅使用 Swift 库的时候只运...

OneAPM蓝海讯通
2015/12/18
22
0
.NET简谈互操作(二:先睹为快)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之释放非托管内存) .NET简谈互操作...

王清培
2011/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
18分钟前
6
0
python上传文件

//注意 <form action="/login/" method="post" enctype="multipart/form-data"> f=request.FILES.get('fafa') ff=open(f.name,mode='wb') for i in f.chunks(): ff.write(i) ff.close()......

南桥北木
30分钟前
0
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
33分钟前
0
0
信号量有没有容量限制?

之前一直误以为信号量初始化的时候那个初始化的值是信号量的“容量”,昨天同事指出了我的错误,最初我是不相信的,经过以下代码实践,证明了我的错误: Java版: import java.util.concurr...

锟斤拷烫烫烫
37分钟前
0
0
【RocketMQ】Message存储笔记

概述 消息中间件存储分为三种,一是保存在内存中,速度快但会因为系统宕机等因素造成消息丢失;二是保存在内存中,同时定时将消息写入DB中,好处是持久化消息,如何读写DB是MQ的瓶颈;三是内...

SaintTinyBoy
48分钟前
0
0
Android应用Context详解及源码解析

Android应用Context详解及源码解析 本文定位:优质文章收集 本文转载 1 背景 今天突然想起之前在上家公司(做TV与BOX盒子)时有好几个人问过我关于Android的Context到底是啥的问题,所以就马...

lichuangnk
今天
0
0
PostgreSQL的昨天今天和明天

PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS), 也是目前功能最强大,特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。 这个起源于伯克利(...

闻术苑
今天
1
0
Mysql对自增主键ID进行重新排序

1,删除原有主键: ALTER TABLE `table_name` DROP `id`; 2,添加新主键字段: ALTER TABLE `table_name` ADD `id` MEDIUMINT( 8 ) NOT NULL FIRST; 3,设置新主键: ALTER TABLE `table_nam......

niithub
今天
0
0
福利篇:免费csdn vip账号分享

分享一个发布免费csdn vip账号的网站:啰嗦vip www.lostvip.com , 各种软件开发类的视频教程:慕课网、动脑学院、黑马各大培训机构VIP视频教程,非常不错!

在水一方发盐人
今天
1
0
Nginx+Tomcat搭建高性能负载均衡集群

一、 工具   nginx-1.8.0   apache-tomcat-6.0.33 二、 目标   实现高性能负载均衡的Tomcat集群:    三、 步骤   1、首先下载Nginx,要下载稳定版:      2、然后解压两个Tom...

码代码的小司机
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部