iOS面试题

  • weak指针自动置nil的实现原理

runtime机制中有全局弱引用hash表,当weak指针修饰对象时会在其中注册,将对象地址为key,值为weak修饰指针的地址数组,当对象销毁时,调用dealloc,内部会调用clearDealocating函数,在全局弱引用表中,根据对象地址key取出weak指针的地址数组value,然后迭代遍历将所有weak指针设置为空。

  • 一个NSObject对象占用多少内存

一个NSObjct对象占用了16个字节(通过malloc_size函数可以获得),但内部使用了8个字节(一个isa指针),可以通过class_getInstanceSize可以获得。

  • 对象的isa指针指向哪里?

instance对象的isa指向class对象;
class对象的isa指向meta-class对象;
meta-class对象的isa指向基类的meta-class对象
(arm64架构后,isa指针经过优化,并不是直接指向,而要&isa_mask才能获取到对象的指向)

  • OC对象的类信息存放在哪里

对象方法、属性、成员变量、协议信息存放在class对象中;类方法存放在meta-class对象中,成员变量的具体置存放在instance对象中。

  • KVO实现原理(KVO的本质是什么)

利用Rumtime动态生成一个子类,并让instance对象的isa指向这个全新的类,当instance对象的属性修改时,会调用Foundation的_NSSetXXXValueAndNotify函数,该函数内部的调用流程是,先调用willChangeForKey:,父类原来的setter,didChangeForKey。然后内部会触发监听器(Observer)的监听方法(observeValueForKeyPath:ofObject:change:context:)

  • 如何手动触发KVO

手动调用willChangeForKey:和didChangeForkey:

  • 直接修改成员变量会触发KVO吗?

不会,直接修改成员变量并不会调用set方法。

  • KVC的赋值和取值过程是怎样的?原理是什么?

  • Category的是实现原理?

Categort编译之后的底层结构是结构体struct_gategory_t,里面存储着分类的对象方法、类方法、属性、协议信息,在程序运行的时候,rutime会将gategory的数据合并到类信息中(类对象、元类对象)

  • Category和Class Extension的区别?

Class Extension在编译的时候,它的数据就已经包含在类信息中。
Category是在运行的时候,才会将数据合并到类信息中。

  • Category有load方法吗?load方法是什么时候调用的?load方法可以继承吗

有load方法;load方法,在加载类、分类时调用;load方法可以继承,但一般不会主动去调load方法,都是让系统自动去调。

  • load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

  • Category能否添加成员变量?如果可以,如何给Category添加成员变量?

category不可以直接添加成员变量,可以通过rumtime添加关联的方式间接实现category有成员变量的效果。

  • block的原理是怎样的?本质是什么?

封装了函数调用以及函数调用的环境。

  • __block的作用是什么?有什么使用注意点?

__block修饰的变量可以在block内部修改,__block的本质是将变量包装为对象。__block不可以用来修饰全局变量,静态变量。

  • block的属性修饰词为什么是copy?使用block有哪些使用注意?

block修饰词为copy,是为了让block变为堆block,便于使用和内存管理。使用注意:循环引用。

  • block在修改NSMutableArray,需不需要添加__block?

不需要。

  • 讲一下 OC 的消息机制

OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息(selector方法名)
objc_msgSend底层有3大阶段
消息发送(当前类、父类中查找)、动态方法解析、消息转发

-####什么是Runtime?平时项目中有用过么?
OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行
OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数
平时编写的OC代码,底层都是转换成了Runtime API进行调用
具体应用
利用关联对象(AssociatedObject)给分类添加属性
遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)
交换方法实现(交换系统的方法)
利用消息转发机制解决方法找不到的异常问题

你可能感兴趣的:(iOS面试题)