美文网首页
面试题(2)

面试题(2)

作者: _菩提本无树_ | 来源:发表于2017-06-28 14:37 被阅读0次

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属性改变)

2.是否可以把比较耗时的操作放在NSNotificationCenter中

回答:1>如果在异步发送通知,那么可以执行比较耗时的操作

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,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等,需要导入

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

什么是runtime?

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

3>因此,可以说runtime是OC的底层实现,是OC的幕后执行者

runtime有啥用?

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

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

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

常见的函数、头文件

#import : 成员变量、类、方法

class_copyIvarList : 获得某个类内部的所有成员变量

class_copyMethodList : 获得某个类内部的所有方法

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

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

method_exchangeImplementations : 交换2个方法的实现

#import 消息机制

objc_msgSend(...);

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

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

图解:runtime实现遍历所有成员变量

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

但是如果在imageWithName方法内在调用imageNamed就会导致死循环。

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

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

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

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

iOS面试题04-runtime

标签:classlogcomhttp使用代码srcitla

原文:http://www.cnblogs.com/linmingjun/p/4787770.html

相关文章

  • this的指向的面试题

    面试题1 面试题2 面试题3 面试题4

  • 面试所涉及的问题

    面试题参考1 : 面试题 面试题参考2 : 内存管理 面试题参考3 :面试题 ...

  • 面试材料

    面试经验 面试题1 面试题2 面试题3 面试题4 面试题5 面试题6――数据结构 面试题7――网络 面试题8――汇...

  • 前端面试比较好的文章

    1、前端开发面试题2、vue面试题总汇

  • Android 面试BAT大厂

    主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)混合开发面试题 (4)高端技术面试题...

  • Android 面试BAT大厂

    主要分为以下几部分: (1)java面试题(2)Android面试题(3)混合开发面试题(4)高端技术面试题(5)...

  • android面试题和答案1

    主要分为以下几部分: (1)java面试题(2)Android面试题(3)混合开发面试题(4)高端技术面试题(5)...

  • l 主要分为以下几部分: (1)java 面试题 (2)Android 面试题 (3)高级开发技术面试题 (...

  • IOS面试(2018)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

  • ios-面试题链接(四)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

网友评论

      本文标题:面试题(2)

      本文链接:https://www.haomeiwen.com/subject/iieucxtx.html