iOS面试题04-runtime

runtime/KVO等面试题

1.KVO内部实现原则面试

回答:1>KVO是基于runtime机制实现的数组

   2>当某个类的对象第一次被观察时,系统就会在运行期动态地建立该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。异步

派生类在被重写的setter方法实现真正的通知机制(Person->NSKVONOtifying Person)函数

 Person类对象p设置self控制器且设置监听属性,就会调用observeValueForKeyPath方法,当Person类的属性被改变时,就会动态生成一个子类继承自Person类(NSKVONotifying_Person),重写setAge方法,内部调用父类setAge方法,通知监听器线程

[监听器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];设计

原先age属性不改变时p对象 isa指向Person,当age属性改变时p对象 isa指向NSKVONotifying_Person(setAge从新内部就会传递变量至父类且通知监听器age属性改变)3d

2.是否能够把比较耗时的操做放在NSNotificationCenter中对象

回答:1>若是在异步发送通知,那么能够执行比较耗时的操做blog

        2>若是在主线程发送通知,那么就不能够执行比较耗时的操做继承

 图--2

图---1

3.Foundation对象与Core Foundation对象有什么区别

回答:1>Foundation对象是OC的,Core Foundation是C语言对象

         2>Foundation对象和Core Foundation对象能够互相转换的,数据类型之间的转换

     ARC:__bridge_retained/__bridge_transfer

   非ARC:__bridge

 

4.不用中间变量,用两种方法交换A和B

回答:A= A + B

       B= A -B

      A = A - B

     或者

    A= A^B

   B = A ^ B

   A = A^B;

5.简单描述下对单例模式设计的理解?

回答:节省内存资源,一个应用就一个对象

 

6.什么是动态,举例说明

1>在程序运行过程才执行的操做,例如KVO的内部实现原理,一个类的属性值随着程序运行监听属性值的变化

 

7.runtime实现机制是什么,怎么用,通常用于嘛,你还能记得你所使用的相关头文件或者某些方法的名称吗?

回答:运行时机制,runtime库里面包含了跟类/成员变量/方法相关的API,好比获取类里面的全部成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等,须要导入<objc/message.h><objc/runtime.h>

1>runtime,运行时机制,它是一套C语言库

什么是runtime?

2>实际上咱们编写的全部OC代码,最终都是转成了runtime库的东西,好比类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(因此说OC有个消息发送机制)

3>所以,能够说runtime是OC的底层实现,是OC的幕后执行者

runtime有啥用?

1>能动态产生一个类、一个成员变量、一个方法

2>能动态修改一个类、一个成员变量、一个方法

3>能动态删除一个类、一个成员变量、一个方法

常见的函数、头文件

#import <objc/runtime.h> : 成员变量、类、方法

class_copyIvarList : 得到某个类内部的全部成员变量

class_copyMethodList : 得到某个类内部的全部方法

class_getInstanceMethod : 得到某个具体的实例方法(对象方法,减号开头)

class_getClassMethod : 得到某个具体的类方法 (加号)

method_exchangeImplementations : 交换2个方法的实现

#import <objc/message.h> 消息机制

objc_msgSend(...);

 

图解:平时用OC代码设置变量值都转成以下图所示

  

 

图解:runtime机制能够看到很底层的实现,甚至成员变量是私有的。

图解:runtime实现遍历全部成员变量

 图解:使用runtime机制,UIImage类交换2个方法的实现(imageWithName和imageNamed)

可是若是在imageWithName方法内在调用imageNamed就会致使死循环。

交换2个方法的好处:之后一个大项目当中的一个方法使用过多,想动一些手脚和操做,就能够很方便实现。

 

 

图解:修改addObject方法不为空才添加到数组

图解:修改objectAtIndex方法并查看是否越界,如越界返回null,runtime还可防止程序崩溃

附注:self.book[4]执行实际调用objectAtindex方法。

相关文章
相关标签/搜索