iOS之Objective-C面试总(zhao)结(ban)一

Posted 狐狸还在原地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之Objective-C面试总(zhao)结(ban)一相关的知识,希望对你有一定的参考价值。

    

iOS之Objective-C面试总(zhao)结(ban)一

又到了一年一度的辞职热了,写简历、刷面试题又一次被提上了日程,面试题这东西,不刷不知道,一刷啊,才知道自己平时多不注重细节and基础知识点。那么,下面是我整理的一些基础面试题。

以前不太喜欢思维导图,后来发现这东西可真好玩,尤其是最近在学习基金课里各位学姐大力推广,还有各位童鞋整理的笔记可真完美,我也不知不觉喜欢上它了呢。

300字可真难凑,有种高考写作文的赶脚,看着800的小箭头发蒙,话说这可都是你们的青春,你们还记得当时的心情吗?





昨天凑了300字结果没发布,那现在我又看见几道关于Runtime和RunLoop的面试题,不如就一起写在这里,上面凑得字数也保留吧。


  • Runtime


01问objc在像一个对象发送消息时,发生了什么?

解答:根据对象的isa指针找到类对象id,再查询类对象里面methodLists方法函数列表,如果没有找到,再沿着superClass寻找父类,再在父类methodLists方法列表里面查询,最终找到SEL,根据id和SEL确认IMP(指针函数),再发送消息;


02问:什么时候会报unrecognized selector错误?ios有哪些机制来避免走到这一步?

解答:当发送消息的时候,我们会根据类里面的methodLists方法列表去查询我们要动用的SEL,当查询不到的时候,就会一直沿着父类查找,最后查询不到的时候就会报unrecognized selector错误,当系统查询不到方法的时候,会调用 +(BOOL)resolveInstanceMeyhod:(SEL)sel动态解释的方法来添加调用不到的方法,或者我们可以再次使用 -(id)forwardingTargetForSelector:(SEL)aSelector重定向的方法来告诉系统该调用什么方法,保证不会崩溃


03问:能否向编译得到后的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?

解答:① 不能向编译后得到的类增加实例变量;② 能向运行时创建的类中添加实例变量;【解释】① 编译后的类已经注册在Runtime中,类结构体重的objc_ivar_list实例变量的链表和instance_size实例变量的内存大小已经确定,Runtime会调用calss_setvarlayout或class_setWeaklvarLayout来处理strong weak引用,所以不能向存在的类中添加实例变量;② 运行时创建的类是可以添加实例变量,调用class_addlvar函数,但是在调用objc_allocateClassPair之后,objc_registerClassPair之前,原因同上;


04问:Runtime如何实现weak变量的自动置nil?


05问:给类添加一个属性,在类结构体里哪些元素会发生变化?

解答:instance_size:实例的内存大小;objc_ivar_list *ivars:属性列表;


  • RunLoop


01问:RunLoop是做什么的?RunLoop和线程有什么关系?主线程默认开启了RunLoop吗?那子线程呢?

解答:① 内部是do-while循环,在这个循环内部不断地处理各种任务(如Sourse,Timer,Observer)事件。② RunLoop和线程的关系:一个线程对应一个RunLoop,主线程的RunLoop默认创建并启动,子线程的RunLoop没有默认开启,需要手动创建并且启动(调用Run方法);


02问:RunLoop的mode是用来做什么的,有几种mode?

解答:mode是RunLoop里面的运行模式,不同模式下的RunLoop处理事件和消息有一定的差别;系统默认注册了5个mode:① kCFRunLoopDefaultMode:APP的默认mode,通常主线程是在这个mode下运行的。② UITrackingRunLoopMode:界面跟踪mode,用于ScrollView追踪触摸滑动,保证界面滑动时不受其他mode影响。③ UIInitializationRunLoopMode:在刚启动app时进入的第一个mode。启动完成后就不再使用。④ GSEventReceiveRunLoopMode:接受系统事件的内部mode,通常用不到。⑤ kCFRunLoopCommonModes:这是一个占位的mode,没有实际作用。


03问:为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动ScrollView的时候NSTimer确不动了?

解答:NSTimer对象是在NSDefaultRunLoopMode下面调用消息的,但是当我们滑动ScrollView的时候,NSDefaultRunLoopMode模式就自动切换到UITrackingRunLoopMode模式下面,却不可以继续响应nstime发送的消息。所以如果想在滑动scrollview的情况下面还调用nstime的消息,我们可以把nsrunloop的模式更改为NSRunLoopCommonModes.


04问:苹果是如何实现Autorelease Pool的?
解答:Autorelease Pool作用:缓存池,可以避免我们经常写relase的一种方式。其实就是延迟release,将创建的对象添加到最近的autoreleasePool中,等到autoreleasePool作用域结束的时候,会将里面所有的对象的引用计数器 - autorelease。


内容均来源各位大佬,如有侵权,请私信我,谢谢。

以上是关于iOS之Objective-C面试总(zhao)结(ban)一的主要内容,如果未能解决你的问题,请参考以下文章

iOS求职之OC面试题

iOS面试题之内存管理

iOS求职之OC面试题

iOS面试 --Objective-C相关

链表总的首元结点头结点头指针的区别

iOS面试粮食Runtime—消息传递和转发机制Method Swizzling