IOS开发入门iOS 开发 Runtime 运行时机制 完全解读
白羽 2019-04-16 来源 :网络 阅读 738 评论 0

摘要:本文将带你了解IOS开发入门iOS 开发 Runtime 运行时机制 完全解读,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS 开发 Runtime 运行时机制 完全解读,希望本文对大家学IOS有所帮助。


IOS开发入门iOS 开发 Runtime 运行时机制 完全解读


前言
   在最开始听到runtime的时候,我是感到恐惧的,多么高大上的东西啊!!!后来,开始在网上查一些资料,可是就是只有那么几篇,看了好久,还不知所云,所以就更加恐惧了!!!!后来经过查看documents  以及一些国外大牛的blogs,终于对runtime有了更深刻的了解!
   runtime实现的机制是什么
   runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。 在我们平时编写的OC代码中, 程序运行过程时,  其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者 比如说,下面一个创建对象的方法中.
   举例: OC : [[MJPerson alloc] init] runtime :  objc_msgSend(objc_msgSend("MJPerson" , "alloc"),  "init")
   runtime 用来干什么呢??用在那些地方呢?怎么用呢?
   runtime用来干什么?
   runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)
   在程序运行过程中, 动态创建一个类(比如KVO的底层实现) 在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法  遍历一个类的所有成员变量(属性)\所有方法  例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!
   runtime用在哪些地方? 怎么用?
   应用案例:
   #import <objc runtime.h=""></objc>
   给系统分类添加属性
   // 运行时给分类添加属性--get方法- (UIView *)backgroundView  {    return objc_getAssociatedObject(self,  &backgroundViewKey);} // 运行时给分类添加属性--set方法-  (void)setBackgroundView:(UIView *)backgroundView  {    objc_setAssociatedObject(self,  &backgroundViewKey, backgroundView,  OBJC_ASSOCIATION_RETAIN_NONATOMIC);}
   方法交换(黑魔法)
   Method imageNamedMethod = class_getClassMethod(self,  @selector(imageNamed:));// 获取xmg_imageNamedMethod xmg_imageNamedMethod =  class_getClassMethod(self, @selector(xmg_imageNamed:)); //  交互方法:runtimemethod_exchangeImplementations(imageNamedMethod,  xmg_imageNamedMethod);
   获取对象属性/私有属性
   JDGTextField *phoneNumeber = [[JDGTextField alloc]  init];    phoneNumeber.placeholder =  @"请输入手机号";    [phoneNumeber setValue:[UIColor  colorWithRed:246.0/255 green:222.0/255 blue:186.0/255 alpha:1.0]  forKeyPath:@"_placeholderLabel.textColor"];
   字典转模型(KVC)
   [self setValuesForKeysWithDictionary:dict];
   KVC 动态获取属性–下拉刷新
   self.tableView addObserver:self forKeyPath:@"contentOffset"  options:NSKeyValueObservingOptionNew context:nil];
   归档解档
   )NSData-归档2个Person对象到同一文件中 归档(编码) // 新建一块可变数据区NSMutableData *data  = [NSMutableData data];// 将数据区连接到一个NSKeyedArchiver对象NSKeyedArchiver *archiver  = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data]  autorelease];// 开始存档对象,存档的数据都会存储到NSMutableData中[archiver encodeObject:person1  forKey:@"person1"];[archiver encodeObject:person2  forKey:@"person2"];// 存档完毕(一定要调用这个方法)[archiver finishEncoding];//  将存档的数据写入文件[data writeToFile:path atomically:YES]; 2)NSData-从同一文件中恢复2个Person对象 恢复(解码) //  从文件中读取数据NSData *data = [NSData dataWithContentsOfFile:path];//  根据数据,解析成一个NSKeyedUnarchiver对象NSKeyedUnarchiver *unarchiver =  [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *person1 =  [unarchiver decodeObjectForKey:@"person1"];Person *person2 =  [unarchiver decodeObjectForKey:@"person2"];// 恢复完毕[unarchiver  finishDecoding];
   NSClassFromString
   NSString *vcName = obj[JDGRootVcName];        Class  vcClass =  NSClassFromString(vcName);        UIViewController  *vc = [[vcClass alloc] init];
   block
   runtime相关函数
   objc_msgSend : 给对象发送消息class_copyMethodList : 遍历某个类所有的方法class_copyIvarList :  遍历某个类所有的成员变量class_..... 这是我们学习runtime必须知道的函数!
   runtime原理机制
       

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程