iOS元类面试一题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cairo123/article/details/80947033

好久没有更新博客了,最近又在找工作,公司突然裁员了,骂了隔壁,今天面试的时候遇到了一道程序题,限于本人水平,没有答出来,回来之后经过详细考虑和讨论之后,得到了结果,现在记录于此。

题目就是“下面这个程序的输出的结果是什么?”。
面试题

刚开始看到这题目的时候我懵逼了,完全不知道是怎么回事。因为从来没有碰到过这种面试题,也没有这么写过。于是回来各种请教,各种查资料,最终终于得到结果。答案就在下面这张图上:
类图

在面试的时候,我也考虑了这个图,但是可能是由于紧张,我竟然把这张图给画错了,尴尬的一逼。这道题的答案是两个调用都会输出”foo”。

Class的结构如下所示:
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开发人员讨论出来的结果,答案应该是正确的。若有错误,感谢批评指正。

阅读更多
换一批

没有更多推荐了,返回首页