文档章节

runtime讲解<三>

刀客445
 刀客445
发布于 2016/05/21 15:00
字数 606
阅读 13
收藏 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
杭州
私信 提问
加载中
请先登录后再评论。
ArcGIS Runtime SDK for WPF学习笔记(一)

  本节主要讲解如何安装ArcGIS Runtime SDK,以及移除注释与水印。   附上ArcGIS Runtime SDK for .NET的官方操作手册网址:https://developers.arcgis.com/net/latest/wpf/guide/instal...

osc_05yddh2u
2019/12/04
2
0
YYModel底层解析- Runtime

这段时间一直在忙新的需求,没有时间来整理代码,发表自己技术博客,今天我们来看一下YYModel的底层解析以及如何使用,希望对大家有所帮助! 一 概述 概括 YYModel是一个轻量级的JSON模型转换...

osc_1njk964l
2018/09/16
1
0
LeadTools Android 入门教学——运行第一个Android Demo

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

葡萄城控件技术团队
2015/03/26
124
0
iOS从初级至高级开发工程师面试知识点

前言: 从网上看到一张关于iOS高级开发工程师具备知识的脑图,这里把图片内容转成自己未来三个月要自己学习的大纲!!!先把整体框架搭出来,也相当于给自己定个学习计划吧。 正文: 一、多线...

osc_wff1160a
2018/07/23
4
0
Category、load、initialize 源码讲解

今天深圳天气有暴风雨,没有事情干,趁着周末和平常晚上写一篇关于Category知识的梳理!可能针对平常只会知道些category基本结论知道的人有些帮助,写这篇博客会按照下面的目录结合实例以及C...

osc_gh6k9o49
04/26
17
0

没有更多内容

加载失败,请刷新页面

加载更多

​DAX 2 中文版在线学习

阅读学习传送门 本文分享自微信公众号 - PowerBI战友联盟(powerbichina)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。...

BI佐罗
2019/11/17
0
0
《OpenCV 4快速入门》终于见面啦!

近几个月以来,有众多小伙伴在公众号后台或者微信群里询问《OpenCV 4快速入门》出版的进度。非常感谢大家对本书的关注和期待,经过了不断地修改和完善,这次终于可以大声的告诉各位小伙伴。 ...

小白学视觉
06/16
0
0
GitHub 通过 jsdelivr CDN加持

GitHub 通过 jsdelivr CDN加持 两种引用方式: 存入仓库分支里面,直接引用 创建版本号后,在引用 在这是不是很好奇,为什么引用要弄成这么麻烦。网上我看过类似教程,他们总是忽略一个关键的...

Zero游戏人生丶
37分钟前
0
0
百人计划 5期 启动报名

温馨提醒: 1. 在2月22日24点前,此公号后台回复「百人计划」可先预定再报名,可以省100 RMB 2. 在2月25日24点前,报名成功的,省50 RMB 3. 一旦报名,一律不退费(建议报名前,想清楚,再报...

IDO老徐
02/20
8
0
Android小知识-如何加载外部dex文件中的类

想要了解插件化,首先得知道如何加载外部的dex文件,这里的插件APK会存放在主APP的assets目录中,用于模拟服务器下载插件。 第一步:创建主项目和插件项目 先创建我们的主项目,并在项目中创...

音视频开发进阶
05/13
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部