4 中级ios开发工程师面试题

#4 中级iOS开发工程师面试题

4.1 MVC的理解

MVC设计模式考虑三种对象:数据模型对象、视图对象、控制器对象。

  • 数据模型(M):负责存储、定义、操作数据
  • 视图(V):用来战术数据给用户,和用户进行操作交互
  • 控制器(C):MV的协调者,控制获取数据,将数据交给视图取展示

4.2 线程和进程

进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统畸形资源分配和调度的一个独立单元。
线程:线程是进程的的一个实体,是cpu调度和分派的基本单位,是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),一个线程可以创建和撤销另一个线程。

4.2.1 线程和进程的关系

  1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  2. 资源跟配给进程,同一进程的所有线程共享该进程的所有资源。
  3. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
  4. 真正在处理机上运行的是线程。
  5. 线程是指进程內的一个可执行单元,也是进程內的可调度实体。

4.2.2 线程和进程的区别

区别 说明
调度 线程作为调度和分配的基本单元,进程作为拥有过资源的基本单位
并发性 不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
拥有资源 进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源
系统开销 创建或者撤销进程的开销比较大

4.2.3 进程的同步机制

原子操作:、信号量机制、自旋锁、分布式系统等

4.2.4 进程死锁

原因:资源竞争以及进程推进顺序非法
必要条件:4个

  1. 互斥
  2. 请求保持
  3. 不可剥夺
  4. 环路

处理:

  • 鸵鸟策略
  • 预防策略
  • 监测与接触死锁

4.3 KVC和KVO

  1. KVC(键值编码):是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。
  2. KVO (键值观察):是一种能使得对象获取到其他对象属性变化的通知机制。
  3. 实现KVO简直观察模式,被观察的对象必须使用kvc键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVCKVO的基础或者说KVO的实现是建立在KVC的基础之上。

4.4 深复制、浅复制

深复制:不仅复制对象本身,对象持有的属性对象也做复制。
浅复制:只复制对象本身,不对里面的属性复制。

4.5 定义属性时,什么时候用assignretaincopynonatomic?

特性 说明 用途
assign 普通赋值 一般用于基本数据类型,常见委托设计模式,以此来防止循环引用
retain 保留计数 获得了对象的所有权,引用计数+1
copy set是使用副本 一般字符串使用copyFoundation中的不可变对象使用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 其它

  • SVNgit使用
  • 打包静态库
  • APP发布的上架流程
  • Storyboard的使用