定义
- 深拷贝:对指针和对象本身进行了拷贝
- 浅拷贝:只拷贝了指针,并未拷贝对象本身
使用场景
- 对非容器类对象(如NSString、NSMutableString类对象)使用浅拷贝:拷贝的是对象的地址,没有新的内存被分配,只是原来的那块内容多了一个指针指向。也就是说新对象跟原对象都是指向的同一个内存地址,故内容一样
- 对非容器类对象(如NSData、NSMutableData类对象)使用深拷贝:拷贝的是整个对象的内容,是通过给新对象分配了一块新的内存,然后将原对象内存中的内容一模一样在新的内存中写一份。所以内容是一样的,但两者内存地址不同
- 对容器类对象(如NSArray、NSMutableArray对象)使用浅拷贝:新的容器类对象也是指向新的内容地址,但是容器内保存的对象没有进行拷贝,指向的内存地址还是和原容器对象内保存的对象指向的内存地址是一样的,即同一个内存地址
- 对容器类对象(NSDIctionary、NSMutableDictionary类对象)使用深拷贝:对容器对象中的每一个元素都进行拷贝
MRC下的修饰词
- retain:始终是浅拷贝(内存地址指向的是同一处)让新对象指针指向原对象,引用计数+1(也可能不变)。返回的对象是否可变与被复制的对象保持一致(与ARC中的strong一样)
- copy:对于可变对象为深复制(开辟新内存,与原对象指向的不是一个对象了);对于不可变对象是浅复制(不开辟新内存,只是原内存地址加了一个新的指针指向,引用计数+1),返回的对象始终是一个不可变对象
- mutableCopy:始终是深复刻(开辟新内存,与原来对象指向的内存空间不是同一处了),返回的对象始终是一个可变对象
-
注:NSArray应该使用copy
NSMutableArray应该使用strong
网友评论