iOS元类面试一题
Posted 人生如梦91
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS元类面试一题相关的知识,希望对你有一定的参考价值。
好久没有更新博客了,最近又在找工作,公司突然裁员了,骂了隔壁,今天面试的时候遇到了一道程序题,限于本人水平,没有答出来,回来之后经过详细考虑和讨论之后,得到了结果,现在记录于此。
题目就是“下面这个程序的输出的结果是什么?”。
刚开始看到这题目的时候我懵逼了,完全不知道是怎么回事。因为从来没有碰到过这种面试题,也没有这么写过。于是回来各种请教,各种查资料,最终终于得到结果。答案就在下面这张图上:
在面试的时候,我也考虑了这个图,但是可能是由于紧张,我竟然把这张图给画错了,尴尬的一逼。这道题的答案是两个调用都会输出”foo”。
Class的结构如下所示:
其中:
isa: 实例的isa指向Class,Class的isa指向对应的元类
super_class: 指向父类的类指针
name: 类的名字
version: 类的版本
info: 类的一些信息,什么信息不清楚
instance_size: 实例变量的大小
ivars: 类的成员变量
methodLists: 保存类的成员方法
cache: 保存最近调用的一些方法,用于优化方法查找
protocols: 保存类实现的一些协议
其中,类的实例方法是存储在类的methodLists中,而类方法则是存储在元类的methodLists中,因此根据上图,NSObject的元类的superclass是指向Class,当调用[NSObject foo]的时候,因为这是一个类方法调用,所以从元类中查找签名为foo的方法,没有发现,然后再沿superclass继续查找,结果在Class中查找到该方法,于是调用该方法输出。但如果将NSObject的分类,换成其他类的分类,如NSString,会发现程序崩溃,这是因为签名为foo的函数在NSString中,而当我们进行类方法调用的时候,最后会查找到NSObject的Class中,但该Class中并没有对应的方法签名,于是再沿superclass向上查找,由于NSObject的superclass是nil,于是抛出unrecognized selector。
以上结果是我们一群ios开发人员讨论出来的结果,答案应该是正确的。若有错误,感谢批评指正。
以上是关于iOS元类面试一题的主要内容,如果未能解决你的问题,请参考以下文章
前端面试官常问javaScript编程题,隔壁王大爷看了都会了