- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)