ios常见面试题总结

1.谈一谈IOS内存管理机制。

IOS内存管理机制的原理是引用计数,当这块内存被创建后引用计数加1,这时若果有另一个对象或指针指向这块内存,那么引用计数再加1,之后如果有一个对象不再指向这块内存,则引用计数减1,最后当不在有对象或指针指向这块内存,引用计数变为0,则这块内存被释放。

copy和strong都修饰对象,
strong修饰的nsstring,属于浅拷贝,不会开辟新内存,会根据原数据的改变而改变,一般修饰可变数据。
copy修饰的nssting,属于深拷贝,会开辟新的内存,不会根据原数据的改变而改变。一般修饰不可变数据。

assign,弱引用,修饰基本数据类型,也可修饰对象,但是会产生野指针。
weak,弱引用,只可修饰对象。

2,vc的生命周期。
loadView
viewDidLoad
viewWillAppear
viewWillLayoutSubviews
viewDidLayoutSubviews
viewDidAppear
viewWillDisAppear
viewDidDisAppear
dealloc

3,kvc和kvo的实现原理。
KVC : 键值编码(Key-Value Coding),它是一种通过key值访问类属性的机制,其中 KVC 原理:当调用- (void)setValue:(id)value forKey:(NSString *)key时,KVC底层的执行机制如下:先搜索对应属性的setter方法,如果没有搜索到,就查找_key,_isKey,key,isKey,最后赋值。
KVO:对监听的类会生成一个它的派生子类,然后重写了被观察属性setter方法,当属性发生改变时,发送通知获取到属性的更改情况。

4,Runloop。
主线程的默认就有了 Runloop。
一个线程对应一个 Runloop。
Runloop 存储在一个全局的可变字典里,线程是 key ,Runloop 是 value。

RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重写启动一个运行模式。
-kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行

  • UITrackingRunLoopMode, 跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响)
  • kCFRunLoopCommonModes, 伪模式,不是一种真正的运行模式
  • UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用
  • GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到

Runloop的作用:
1,处理crash,在主线程中调用堆栈中异常信号,当捕获到异常信号的时候,用Runloop保住线程,以致于程序不会立马crash
2,线程保活 子线程方法中添加runloop。
3,检测 优化卡顿 将observer添加到主线程,将Timer添加到子线程的runloop中

5,runtime。
Runtime是iOS核心运行机制之一,iOS App加载库、加载类、执行方法调用,全靠Runtime。
runtime是一套比较底层的纯C语言API, 属于一个C语言库, 包含了很多底层的C语言API。
在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码。

objc_msgSend : 给对象发送消息
class_copyMethodList : 遍历某个类所有的方法
class_copyIvarList : 遍历某个类所有的成员变量

runtime具体应用

利用关联对象(AssociatedObject)给分类添加属性
遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)
动态交换方法实现(交换系统的方法)
利用消息转发机制解决方法找不到的异常问题
KVC 字典转模型

消息转发机制:有3个阶段,消息发送,动态解析方法,消息转发。
消息发送:当调用某个对象的方法的时候,会通过isa指针找到该类的cache缓存列表中查找,如果没有找到就去方法列表中查找,如果还没有找到就去他的父类中查找,直到最后查找到后为nil。
然后就调用动态解析方法。
是指在运行时通过类的resolvemethd方法动态为这个这个方法创建实现,如果还是没有找到,
就通过消息转发,把这个消息发送给其他对象来找这个方法。最后还没找到,就会抛出异常。

6,多线程。
NsTread,属于轻量级的,需要手动管理线程周期。
GCD,是基于c语言的线程,自动管理线程周期。
NSOpreation,是基于GCD封装的,具有更多的功能。

串行同步,不需要开辟线程,一个一个执行。
串行异步,不需要开辟新的线程,一起执行。
并行同步,开辟新的线程,一个一个执行。
并行异步,开辟新的线程,一起执行。

两个子线程,需要同步执行,需要使用信号量,线程锁,栅栏。
多个子线程全部执行完,在进入子线程,使用线程组,groupEnter,GroupLeave

你可能感兴趣的:(ios常见面试题总结)