iOS基础问题。。。
1.深复制和浅复制的区别
对象拷贝的两种方式,深复制就是复制整个对象到另一个内存中,浅复制就是复制指向对象的指针,并不拷贝对象本身。
简单的来说浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,内存中的类容是一样的。
2.非集合对像的copy和Mutablecopy
(1)可变对象的copy和mutableCopy方法都是深复制
(2)不可变对象的copy方法是浅复制,mutableCopy方法是深复制
(3)copy方法返回的对象是不可变对象
3.集合对像如果用copy 内部的元素是浅复制如果要深复制则:
NSSarray *array2 = [[NSSarrray alloc]initwitharray:array1 copyItem:YES];这样做的结果是内部元素都是深复制。
4.oc中属性特征
主要有assign retain copy 还有readonly,readwrite. 另外,atomic和nonatomic;以及strong,weak。
(1)readwrite是可读可写特征;需要生成getter方法和setter方法;
(2)readonly是只读特性只会生成getter方法不会生成setter方法;
(3)assign赋值特性,setter方法将传入参数赋值给实例变量;
(4)retain 表示持有特性,setter方法将传入参数先保留,再赋值,并且变量retaincount(引用计数)+1;
(5)copy 通过copy将对象复制一份,之前的对象会释放;
(6)strong 强引用,计数器+1;
(7)weak 弱引用 计数器不加一;
(8)nonatomic 非原子性;(一般使用他)
(9)atomic 原子性,确保其操作的原子性;
(10)unsafe_unretained 和weak的功能差不多
5.OC中的内存管理
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。 而判断对像是否要销毁的唯一依据的是应用计数是否为0 为0则销毁。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
ARC Automatic Reference Counting 自动引用计数---一般使用这个
MRC Manual Reference Counting 手动引用计数
自动释放池。
6.kvc kvo
kvc key value coding 键值编码
[ setvalue: forkey:]
kvo 简单的通知模式