iOS BAT面试对答题
发布时间:2023-03-31 14:18:38 所属栏目:教程 来源:
导读:Runtime相关面试问题1.Runtime是什么?见名知意,其概念无非就是“因为Objective-C是一门动态语言,所以它需要一个运行的系统……这就是Runtime系统”云云。对于博主这种菜鸟而言,Runtime在实
|
Runtime相关面试问题1.Runtime是什么?见名知意,其概念无非就是“因为Objective-C是一门动态语言,所以它需要一个运行的系统……这就是Runtime系统”云云。对于博主这种菜鸟而言,Runtime在实际开发中,其实就是一组C语言的函数。胡适说:“多研究些问题,少谈些主义”,云山雾罩的概念听多了 Runtime相关面试问题 1.Runtime是什么? 见名知意,其概念无非就是“因为 Objective-C 是一门动态语言,所以它需要一个运行时系统……这就是 Runtime 系统”云云。对博主这种菜鸟而言,Runtime 在实际开发中,其实就是一组C语言的函数。胡适说:“多研究些问题,少谈些主义”,这样的云山雾罩的概念听多了总是难免容易心浮气躁头晕,接下来我们直接上runtime思维导图帮助大家理清思路: 2.objc在向一个对象发送消息时,发生了什么? objc在向一个对象发送消息时,runtime会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果一直到根类还没找到,转向拦截调用,走消息转发机制,一旦找到 ,就去执行它的实现IMP 。 3.objc中向一个nil对象发送消息将会发生什么? 如果向一个nil对象发送消息,首先在寻找对象的isa指针时就是0地址返回了,所以不会出现任何显而易见的错误。也不会崩溃。 4.objc中向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系? 在objc编译时,[obj foo] 会被转意为:objc_msgSend(obj, @selector(foo));。 5.什么时候会报unrecognized selector的异常? objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,如果,在最顶层的父类中依然找不到相应的方法时,会进入消息转发阶段,如果消息三次转发流程仍未实现,则程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX 。 6.能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么? 不能向编译后得到的类中增加实例变量; 7.给类添加一个属性后,在类结构体里哪些元素会发生变化? instance_size :实例的内存大小;objc_ivar_list *ivars:属性列表 8.一个objc对象的isa的指针指向什么?有什么作用? 指向他的类对象,从而可以找到对象上的方法Root class (class)其实就是NSObject,NSObject是没有超类的,所以Root class(class)的superclass指向nil。 9.runtime如何通过selector找到对应的IMP地址? 每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现. 10._objc_msgForward函数是做什么的,直接调用它将会发生什么? _objc_msgForward是 IMP 类型,用于消息转发的:当向一个对象发送一条消息,但它并没有实现的时候,_objc_msgForward会尝试做消息转发。 11.runtime如何实现weak变量的自动置nil?知道SideTable吗? runtime 对注册的类会进行布局,对于 weak 修饰的对象会放入一个 hash 表中。 12.使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 无论在MRC下还是ARC下均不需要,被关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的object_dispose()方法中释放。 ** 详解: ** 13.什么是method swizzling(俗称黑魔法) 简单说就是进行方法交换在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
