1、浅复制和深复制的区别
浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
2、KVO and KVC
kvc: 键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。很多情况下可以简化程序代码。
kvo: 键值观察机制,他提供了观察某一属性变化
3、frame和bounds有什么不同
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
4、进程与线程
进程:进程就是一个正在运行的程序(一堆CPU指令的集合),进程里至少应该包含一个线程。
线程:一条不分叉的CPU指令的集合,就是一个线程。
多线程:在一个进程里面,有多条不分叉的CPU指令的集合,就是多线程。
一个真正的CPU(指物理的CPU),一个物理的CPU可以虚拟成多核的CPU。每一个虚拟出来的CPU核同时的某一时刻,只能执行一个CPU指令。那么,假设CPU虚拟成了两个核,其中一个核分给了“主线程”,另一个核需要去处理3个“分线程”,分别是以下3个线程:
线程1:该条不分叉的CPU指令集包括 20句指令
线程2:该条不分叉的CPU指令集包括 15句指令
线程3:该条不分叉的CPU指令集包括 30句指令。
由于上边提到,虚拟处的CPU核在同一时刻,只能执行一个CPU指令。
上下文切换(即,多一个CPU处理多线程时,会将处理过的线程的指令的信息保存在寄存器里面,然后将时间片分配给其他线程,当时间片再轮转过来的时候会将寄存器状态恢复,接着执行没有执行完的指令)
多线程的优点:
为了提高用户体验
但是多线程也有它的缺点:
1、比较耗费系统资源
2、造成资源竞争
3、会出现 死锁
5、retain/copy/assign/release/autorelease/dealloc/strong/weak关键字
retain:使对象的引用计数+1
copy:复制内容
assign:
release:使对象的引用计数-1
autorelease:
dealloc:
strong:
weak: