#4 中级iOS开发工程师面试题
4.1 MVC的理解
MVC
设计模式考虑三种对象:数据模型对象、视图对象、控制器对象。
- 数据模型(
M
):负责存储、定义、操作数据- 视图(
V
):用来战术数据给用户,和用户进行操作交互- 控制器(
C
):M
与V
的协调者,控制获取数据,将数据交给视图取展示
4.2 线程和进程
进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统畸形资源分配和调度的一个独立单元。
线程:线程是进程的的一个实体,是cpu调度和分派的基本单位,是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),一个线程可以创建和撤销另一个线程。
4.2.1 线程和进程的关系
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 资源跟配给进程,同一进程的所有线程共享该进程的所有资源。
- 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
- 真正在处理机上运行的是线程。
- 线程是指进程內的一个可执行单元,也是进程內的可调度实体。
4.2.2 线程和进程的区别
区别 | 说明 |
---|---|
调度 | 线程作为调度和分配的基本单元,进程作为拥有过资源的基本单位 |
并发性 | 不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行 |
拥有资源 | 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源 |
系统开销 | 创建或者撤销进程的开销比较大 |
4.2.3 进程的同步机制
原子操作:、信号量机制、自旋锁、分布式系统等
4.2.4 进程死锁
原因:资源竞争以及进程推进顺序非法
必要条件:4个
- 互斥
- 请求保持
- 不可剥夺
- 环路
处理:
- 鸵鸟策略
- 预防策略
- 监测与接触死锁
4.3 KVC和KVO
KVC
(键值编码):是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。KVO
(键值观察):是一种能使得对象获取到其他对象属性变化的通知机制。- 实现
KVO简直观察模式
,被观察的对象必须使用kvc
键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC
是KVO
的基础或者说KVO
的实现是建立在KVC
的基础之上。
4.4 深复制、浅复制
深复制:不仅复制对象本身,对象持有的属性对象也做复制。
浅复制:只复制对象本身,不对里面的属性复制。
4.5 定义属性时,什么时候用assign
、retain
、copy
、nonatomic
?
特性 | 说明 | 用途 |
---|---|---|
assign |
普通赋值 | 一般用于基本数据类型,常见委托设计模式,以此来防止循环引用 |
retain |
保留计数 | 获得了对象的所有权,引用计数+1 |
copy |
set 是使用副本 |
一般字符串使用copy ,Foundation 中的不可变对象使用copy 效果相当于retain ,只是引用计数+1 |
nonatomic |
非原子性访问,不加同步 | 多线程并发访问会提高性能 |
4.6 内存管理
4.6.1 strong与weak,_unsafe_unretained与weak的区别
特性 | 说明 | 备注 |
---|---|---|
strong |
强引用 | 在ARC 中,使用strong 告诉编译器自动插入retain |
weak |
弱引用 | 在ARC 中,weak 相当于手动管理内存的assign |
_unsafe_unretained |
安全版weak |
与weak 功能一致,区别在于当指向的对象销毁后,weak 会将变量置为nil ,防止调用野指针 |
4.6.2 ARC
存在内存泄漏吗?
循环引用导致内存泄漏,
Objective-C
对象与CoreFoundation
类之间桥接时,管理不当也会产生内存泄漏。
4.7 事件响应者链
响应者链表示一系列的响应者对象。事件被交由第一响应者对象,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者。
View -> ViewController -> Window -> application -> 丢弃事件
4.8 其它
SVN
、git
使用- 打包静态库
APP
发布的上架流程Storyboard
的使用