iOS运行时 runtime

1、运行时介绍

1. 什么是运行时

运行时机制是用 C++开发的,是一套苹果开源的框架

OC
是基于运行时开发的语言,在OC中所有的类都是运行的时候才加载。

2. OC语言

OC 是一个全动态语言,OC的一切都是基于 Runtime实现的

只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法

3. 使用场景

1. 运行时动态获取类的属性

//主要应用:字典转模型框架 MJExtension,JSONModel

2.利用关联对象为分类添加属性

3.利用交换方法拦截系统或其他框架的方法

//误区:并不是使用的技术越底层,框架的效率就会越高

4. 头文件

#import <objc/runtime.h>

2、运行时应用

1. 运行时获取列的属性等相关信息

1. 获取类的属性列表

/**
 如果要想动态的获取类的属性,需要使用到“运行时机制”

 class_copyIvarList 成员变量
 class_copyPropertyList 属性
 class_copyMethodList 方法
 class_copyProtocolList 协议
 */
/// 返回类的属性列表
+ (NSArray *)propertyList {

	// 0. 判断是否存在关联对象, 如果存在, 直接返回
	/** 参数
	 1> 关联到得对象
	 2> 关联的属性 key
	 */
	NSArray *plist = objc_getAssociatedObject(self, propertiesKey);
	if (plist) {
		return plist;
	}

	// 1. 获取 '类的属性'
	/**
	 1> 类
	 2> 属性的计数指针
	 */
	unsigned int count = 0;
	// 返回值是所有属性的数组 obj_property_
	objc_property_t *list = class_copyPropertyList([self class], &count);

	// 创建 存储属性数组
	NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];

	for (int i = 0; i < count; ++i) {

		// 获取属性
		objc_property_t pty = list[i];

		// 获取属性名
		const char *cname = property_getName(pty);
		[arrayM addObject:[NSString stringWithUTF8String:cname]];
	}

	// 释放属性数组
	free(list);

	// 设置关联对象
	/**
	 1> 关联的对象
	 2> 关联对象的 key
	 3> 属性数值
	 4> 属性的持有方式 reatin, copy, assign
	 */
	objc_setAssociatedObject(self, propertiesKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);

	return arrayM.copy;
}

字典转模型方法

/// 字典转模型方法
+ (instancetype)objectWithDict:(NSDictionary *)dict
{
	id obj = [[self alloc] init];

	// 获取属性列表
	NSArray *properties = [self propertyList];

	// 遍历属性数组
	for (NSString *key in properties) {
		// 判断字典中是否包含这个key
		if (dict[key] != nil) {
			// 使用 KVC 设置属性值
			[obj setValue:dict[key] forKeyPath:key];
		}
	}

	return obj;
}

2.  返回类的方法列表

/// 返回类的方法列表
+ (NSArray *)methodList {

	// 0. 判断是否存在依赖关系
	NSArray *mlist = objc_getAssociatedObject(self, methodsKey);
	if (mlist) {
		return mlist;
	}

	unsigned int count = 0;
	// 1. 获取方法列表
	Method *list = class_copyMethodList([self class], &count);

	// 存储方法数组
	NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];

	for (int i = 0; i < count; ++i) {
		// 获取方法
		Method method = list[i];
		// 获取方法名
		SEL mname = method_getName(method);

		[arrayM addObject: NSStringFromSelector(mname)];
	}

	// 释放数组
	free(list);

	// 设置依赖关系
	objc_setAssociatedObject(self, methodsKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC);

	return arrayM.copy;
}

3. 返回类的实现协议列表

/// 返回类的实现协议列表
+ (NSArray *)protocolList {

	// 0. 判断是否存在依赖关系
	NSArray *pList = objc_getAssociatedObject(self, protocolKey);
	if (pList) {
		return pList;
	}

	unsigned int count = 0;
	// 2. 获取协议列表
	Protocol * __unsafe_unretained *list = class_copyProtocolList([self class], &count);

	// 创建协议数组
	NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];

	for (int i = 0; i < count; ++i) {

		// 获取协议
		Protocol * __unsafe_unretained prot = list[i];

		const char *pname = protocol_getName(prot);

		[arrayM addObject:[NSString stringWithUTF8String:pname]];
	}

	return arrayM;
}

实例源码 点击打开链接

时间: 2024-10-11 17:18:22

iOS运行时 runtime的相关文章

iOS 运行时(runtime)浅析

本博客,直接从分类说起.都知道OC中的分类是不能直接添加属性的,意思间接是能添加属性的.那应该怎么添加呢?那就要用到运行时(runtime)机制. 一,运行时金典用法之一 现在,给HGPerson类增加一个分类:HGPerson+HG.h,给一个属性如下: @property (nonatomic, copy) NSString* name; 貌似,这样写了以后,是能调用的,但是运行就报错了. -[HGPerson setName:]: unrecognized selector sent to

iOS运行时Runtime浅析

运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行.例如[target doSomething];会被转化成objc)msgSend(target,@selector(doSomething))来执行.这篇博客会较为全面的来讲解下Runtime. OC是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.这种动态语言的优势在于:写代码能更加灵活,可以把消息转发给想要的对象,或者随意交换一个方法的实现. OC Runtime目前有两个版本:M

iOS 运行时RunTime使用场景一:打点统计用户行为,深度解耦

转自:http://www.jianshu.com/p/0497afdad36d 用户统计.jpeg 用户行为统计(User Behavior Statistics, UBS)一直是移动互联网产品中必不可少的环节,也俗称埋点.在保证移动端流量不会受较大影响的前提下,PM们总是希望埋点覆盖面越广越好.目前常规的做法是将埋点代码封装成工具类,但凡工程中需要埋点(如点击事件.页面跳转)的地方都插入埋点代码.一旦项目越来越复杂,你会发现埋点的代码散落在程序的各个角落,不利于维护以及复用.本文旨在探讨利用

iOS 运行时ScrollView上出现空白空间-解决方案

iOS7 中的UIViewControllers设置了automaticallyAdjustsScrollViewInsets.如果是YES,scrollview会根据status bar, navigation bar以及tool bar或者tab bar的高度自动调整.可以通过在storyboard的右侧进行设置,在Attributes Inspector中,不勾选"Adjust Scroll View Insets". 翻译自: http://stackoverflow.com/

iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)

借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动态修改的.本文旨在对runtime的部分特性小试牛刀,更多更全的方法可以参考系统API文件<objc/runtime.h>,demo例子可以参见CSDN的runtime高级编程系列文章. 我们出发吧! 先看一个非常平常的Father类: #import <Fou

【iOS开发-97】MediaPlayer框架中MPMoviePlayerController类视频播放的使用,运行时runtime

(1)使用媒体播放,需要先加载<MediaPlayer/MediaPlayer.h>框架,并#import导入.媒体播放需要注意的几个点在于: --全屏的设置需要在视图可见后设置才有效. --各种控制主要是通过通知NSnotificationCenter来实现的,有进入/退出全屏,播放暂停状态改变等等. #import "WPMoviePlayController.h" #import <MediaPlayer/MediaPlayer.h> @interface

IOS 运行时(runtime)机制

1. 概述 OC 是一个全动态语言,OC 的一切都是基于 Runtime 实现的 只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法` 2. 运行时机制 运行时机制是用 C++ 开发的,是一套苹果开源的框架 OC 是基于运行时开发的语言 3. 应用场景 运行时动态获取类的属性 主要应用: 字典转模型框架 MJExtension,JSONModel 利用 关联对象 为分类添加属性 利用 交换方法 拦截系统或其他框架的方法 误区:并不是使用的技术越底层,框架的效率就会越高 导入头文件

在Linux安装ASP.Net Core的运行时(Runtime)

在部署的时候,如果您不想在您的Linux服务器上安装.Net Core SDK,您可以只安装Runtime,接下来我们看看该如何安装运行时Runtime. 下载运行时文件 下载页面:https://www.microsoft.com/net/download/linux 先获取一下对应的下载链接,可以使用浏览器点击链接来获取具体文件的下载链接 获取完链接以后,就可以使用命令下获取和安装了 以Centos 7,Ubuntu 16.04为例安装ASP.Net Core 2.0.5的运行时: wget

iOS 之动态运行时 runtime

前言: 最近研究runtime,觉得里面的东西好深,所以决定先把苹果提供的runtime.h文件简单的翻译一下,关于用法会在之后进行一些分享. /* Types */ #if !OBJC_TYPES_DEFINED /// An opaque type that represents a method in a class definition. typedef struct objc_method *Method; /// An opaque type that represents an i