中级iOS开发工程师面试题
1.MVC的理解
MVC即(Model-View-Controller)是模型-视图-控制器的缩写。是一种架构设计,并不属于基本的设计模式(23种设计模式)。
M(Model)数据模型:负责定义、存储、操作数据。比如数据库操作。
V(View)视图:用来展示视图,并进行用户交互
C(Controller)控制器:M和V的协调者,控制获取数据,将数据交给视图去展示。算是链接数据和视图的桥梁。
其中M和V不能直接通信,必须通过C来传递数据和事件。
2.对进程和线程了解多少
关系:
1.数量角度:一个线程只能属于一个进程,而一个进程可以包含多个线程,但至少包含一个线程。
2.资源角度:资源分配给进程,同一个进程中的线程共享该进程的所有资源。
3.线程是进程内的一个可执行单元,也是进程内的可调度实体。
4.真正运行在处理机上的是线程。
5.线程在执行过程中需要协作同步。不同进行的线程间要利用消息通信的办法实现同步。
区别:
1.拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于所在进程的资源。
2.调度:线程作为调度和分配的基本单元,进程作为拥有资源的基本单位(系统根据进程分配资源)。
3.并发性:不仅进程间可以并发执行,同一个进程中的多个线程之间也可以并发执行。
4.系统开销:创建或者销毁进程的开销比较大,因为进程在分配和撤销时需要创建和回收资源。
5.健壮性:进程有自己独立的系统空间,线程没有,进程的撤销对其他进程没有影响,而线程的撤销将可能使所在进程死掉。所以,多进程的程序比多线程的程序健壮。但在进程切换时耗费的资源比较大,效率差。
3.进程的同步与死锁。
进程的同步机制:
原子操作,信号量机制,管道,共享数据等。
- 同步:避免对同一数据的并发访问(通常由中断、对称多处理器、内核抢占等引起)称为同步。
- 原子操作:原子操作确保对同一数据的“读取-修改-写入”操作在它的执行期间不会被打断,要么全部执行完成,要么根本不会执行。
- 信号量机制:信号量S是一个整数,S大于等于零是代表可供并发进程使用的资源实体数,当S小于零时则表示正在等待使用临界区的进程数。
Dijkstra同时提出了对信号量操作的PV原语。
死锁
死锁的原因
资源竞争和进程推进次序不当。
死锁的4个必要条件
互斥、不可剥夺、请求保持、环路。
死锁的处理
鸵鸟策略、预防策略、检测与解除死锁。
其中同步和死锁的部分在操作系统都有。
4.kvc kvo
kvc:键值编码,一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。
kvo:键值观察,一种能使的对象获得到其他对象属性变化的通知机制,也就是所谓的观察者。
kvo的实现必须使用KVO来修改实例变量。这样观察者才能观察到。因此kvc是kvo的基础。
深复制和浅复制
深复制:不仅复制对象本身,对象的属性对象也要复制,注意这里复制内容
浅复制:支付至对象本身,不对里面的属性复制,因此删除原来的对象,新对象中的属性对象的值就成为错误的值了。
assign、copy、retain、nonatomic
-
assign
:普通复制,一般用于基本数据类型,常见委托设计模式,一次来防止循环引用。 -
retain
:保留计数,获得了对象的所有权。引用计数在原有基础上+1. -
copy
:一般字符串使用copy。Foundation中的不可变对象使用copy属性,效果相当于retain,只是引用计数+1. -
nonatomic
:非原子性访问,不加同步,多线程并发访问会提高性能。默认为nonatomic
以上一般都在在非ARC情况下才出现的关键词
strong和weak
strong 强引用,weak弱引用,ARC下,strong被翻译成retain,weak相当于手动管理的assign,代理协议的属性,依然用assign,防止出现循环引用。
_unsafe_unretained与weak
_unsafe_unretained与weak功能一致,区别在于,当指向的对象销毁后,weak换将变量置为nil,防止调用野指针。
ARC存在内存泄露吗?
存在循环引用会导致内存泄露(原因主要在于:协议),Objective-C对象与CoreFoundation类之间的桥接管理不当也会产生内存泄露。
事件响应者链
响应者链表示一系列的响应者对象,事件先被交由第一响应者对象处理,如果第一响应者对象不处理,事件被沿着相应者链向上传递,交给下一个响应者。
View->parent view ->ViewController->window->application->丢弃事件
svn git熟练程度
打包静态库
APP发布上架流程等
Storyboard使用
视图加载顺序
框架模型