iOS-Runtime在开发中的使用及相关面试题解读.doc

iOS-Runtime在开发中的使用及相关面试题解读.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS-Runtime在开发中的使用及相关面试题解读

iOS-Runtime在开发中的使用及相关面试题 OC语言中最为强大的莫过于OC的运行时机制-Runtime,但因其比较接近底层,一旦使用Runtime出现bug,将很难调试,所以Runtime在开发中能不用就不用.下面我将介绍一些Runtime在开发中的使用,已经面试可能遇见的面试题. 1.OC语法和Runtime语法的区别 OC语法和Runtime语法的区别,换而言之就是OC中我们写的语句,最终被转换成Runtime中什么样语句.由于Xcode6之后,苹果不建议使用Runtime,也就是现在在编译的时候,runtime的函数不会提示,需要去配置一下: // 配置步骤: build Seting - 搜索msg - 设置成NO 创建一个控制台程序,在自动释放池中写如下代码: NSObject *objc = [NSObject alloc]; objc = [objc init]; 然后切换到终端命令行,执行以下步骤: cd 切换到你想生成的那个根文件的上一级目录 clang -rewrite-objc main.m // clang -rewrite-objc 目标文件 会在该目录文件下生成一个.cpp文件,打开之后搜索@autoreleasepool(这也就是当时为什么创建控制器程序的原因,好查找转换后的代码在哪儿),就会找到转换后的代码: NSObject *objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass(NSObject), sel_registerName(alloc)); objc = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc, sel_registerName(init)); 上面的代码比较原生态,我们要是直接写runtime的代码如下所示,就能达到创建一个NSObject对象的目的: // objc_msgSend: 两个参数 1. 谁发送这个消息 2. 发送给谁 NSObject *objc = objc_msgSend([NSObject class], @selector(alloc)); objc = objc_msgSend(objc, @selector(init)); 2.消息机制,调用私有方法 面试题: runtime是什么?或者是同类的  答: 其实runtime就是运行时机制,可以通过命令行clang -rewrite-objc 对应的目标文件,就能将对应的OC的代码转成对应的运行时的代码 若是面试官问runtime中是怎么找到对应的方法的,该怎么回答?  答: 首先确定问的是对象方法还是类方法,对象方法保存到类中,类方法保存到元类(meta class),每一个类都有方法列表methodList,每一个方法在方法列表中都有对应的方法编号.(1)根据对象的isa去对应的类查找方法,isa: 判断去哪个类找对应的方法,指向方法调用的类 (2)根据传入的方法编号,才能在方法列表中找到对应得方法Method(方法名).(3)根据方法名(函数入口)找到函数实现 知识扩充: 其实每个方法最终转换成函数的形式,存放在方法区,而每一个函数的函数名都是函数的入口 访问类中私有方法的代码如下: 在对应类中的@implementation实现私有方法: 复制代码 #import Person.h @implementation Person - (void)eat { NSLog(@吃吃吃); } - (void)run: (int)num { NSLog(@跑了%d米, num); } @end 复制代码 在ViewController.m中的代码如下: 复制代码 #import ViewController.h #import Person.h #import objc/message.h /* runtime: 千万不要随便使用,不得已才使用 消息机制: 1. 装逼 2. 调用已知私有的方法 */ @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { Person *p = objc_msgSend([Person class], @selector(alloc)); p

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档