文档章节

runtime讲解<三>

刀客445
 刀客445
发布于 2016/05/21 15:00
字数 606
阅读 12
收藏 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;

© 著作权归作者所有

共有 人打赏支持
上一篇: runtime讲解<四>
下一篇: Objective-C Runtime
刀客445
粉丝 2
博文 47
码字总数 10222
作品 0
杭州
私信 提问
LeadTools Android 入门教学——运行第一个Android Demo

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

葡萄城控件技术团队
2015/03/26
0
0
玩转iOS开发:装逼技术RunTime的应用(一)

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

CainLuo
2017/10/13
0
0
Runtime的使用——利用Runtime将字典转成Model

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

啪神
2016/03/25
103
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

没有更多内容

加载失败,请刷新页面

加载更多

如何处理JavaScript 中的货币值?

 金钱无处不在。   无论在银行应用程序、电子商务网站还是证券交易所平台,我们每天都在与金钱互动。我们也越来越依赖技术来处理问题。   然而,关于如何以编程处理货币价值尚无共识。虽...

数据星河
4分钟前
1
0
并发中的volatile

1. 概述 由于线程有本地内存的存在, 一个线程修改的共享变量不会及时的刷新到主内存中, 使得另一个线程读取共享变量时读取到的仍旧是旧值, 就导致了内存可见性问题. 现在volatile就可以解决这...

Ala6
5分钟前
2
0
三大特性之---封装

封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能...

architect刘源源
8分钟前
1
0
设计模式 之 策略模式

设计模式 之 策略模式 定义 提供几个算法策略,选择其中一个策略去执行。 优点 由于将算法封装成单独的策略,策略可以灵活切换。 扩展性好,符合开闭原则。 缺点 策略多,类也会变多 策略类需...

GMarshal
9分钟前
1
0
HBase集群监控的那些事儿

为什么需要监控? 为了保证系统的稳定性,可靠性,可运维性。 掌控集群的核心性能指标,了解集群的性能表现; 集群出现问题时及时报警,便于运维同学及时修复问题; 集群重要指标值异常时进行...

微笑向暖wx
9分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部