Ø MVC的理解:
- MVC设计模式考虑三种对象:数据模型对象、视图对象、控制器对象
- 数据模型:负责存储、定义、操作 数据
- 视图: 用来展示数据给用户,和用户进行操作交互
- 控制器: M层与V层的协调者,控制获取数据,将数据交给视图去展示
Ø 线程和进程:
概念:
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是 系统 进行
资源分配
和调度
的一个独立单位
- 线程是进程的一个
实体
,是 CPU调度
和分派
的基本单位
,是比进程更小的、能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),一个线程可以创建和撤销另一个线程
关系:
- 一个线程只能属于一个进程,而一个进程可以拥有多个线程,但至少有一个线程
- 资源分配给到进程,同一进程的所有线程共享该进程的所有资源
- 线程在执行过程中,需要协作同步,不同进程的线程间 要利用消息通信的方法实现同步
- 真正在处理机上运行的是线程
- 线程是指进程内的一个可执行单元,也是进程内的可调度实体
区别:
- 调度:线程作为可调度和分配的基本单元,进程作为拥有资源的基本单位
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
- 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源
- 系统开销:创建或撤销进程的开销更大
进程的同步机制:
- 原子操作、信号量机制、自旋锁、分布式系统等
进程死锁的原因:
- 资源竞争以及进程推进顺序非法
死锁的四个必要条件:
- 互斥、请求保持、不可剥夺、环路
死锁的处理:
- 鸵鸟策略、预防策略、检测与解除死锁
Ø KVC和KVO:
- KVC
(键值编码)
是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量 - KVO
(键值观察)
是一种能使得对象或渠道其他对象属性变化的通知机制 - 要实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础
(KVO的实现是建立在KVC的基础上的)
Ø 深拷贝和浅拷贝:
- 深拷贝:不仅复制对象本身,对象所持有的属性对象也会做复制
(深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉)
- 浅拷贝:只复制对象本身,不对里面的属性进行复制
( 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针)
- 区别在于 是否开启新的内存地址,是否影响内存地址的引用计数
- 可参考
Ø 定义属性时,什么时候用assign、retain、copy、nonatomic?
- assign:普通赋值,一般用于基本数据类型,常见的委托设计模式,用此来放置循环引用
- retain:保留计数,获得对象的所有权,引用计数在原有基础上加1
- copy:一般字符串、block使用copy,Foundation中的不可变对象使用copy效果相当于retain,只是引用计数加1
- nonatomic:一般默认情况下都是使用它,非原子性访问,不加同步,多线程并发访问会提高性能
Ø strong与weak、_unsafe_unretained与weak的区别
- strong,强引用;weak,弱引用,在ARC中,使用strong告诉编译器自动插入retain,weak相当于手动管理内存的assign
- _unsafe_unretained与weak的功能一致,区别在于 当指向的对象销毁后,waek会将变量重置为nil,防止调用野指针
Ø ARC存在内存泄漏吗?
- 循环引用导致内存泄漏,Objective-C对象与CoreFoundation类之间桥接时,管理不当也会产生内存泄漏
Ø 事件响应者链
- 响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者
(next responder)
- View->ViewController->Window->application->丢弃事件
网友评论