(一)深拷贝,浅拷贝定义
浅拷贝是当对象的属性是指针变量时,如果程序只是复制该指针的地址,而不是真正复制指针所指向的对象,这种方式就被称为浅拷⻉。
深拷贝不仅会复制对象本⾝,而且会“递归”复制每个指针类型的属性,直到两个对象没有任何的共用部分为⽌。
(二)对象复制方法
NSObject类提供了copy和mutableCopy方法,通过这两个方法即可复制已有对象的副本:
当程序调⽤用对象的copy⽅方法来复制对象时,程序底层需要调⽤用copyWithZone⽅方法来完成实际的复制⼯工作,copy返回的实际上就是copyWithZone⽅方法的返回值,为了保证⼀一个对象可调⽤用copy⽅方法来复制⾃自⾝身的不可变副本,通常需要做如下事情
• 让类实现NSCopying协议
• 让类实现copyWithZone⽅方法
• 让类实现NSMutableCopying协议
• 让类实现mutableCopyWithZone⽅方法
在iOS SDK中常⽤用的可复制对象有:NSNumber、NSString、NSArray、NSDictionary、NSMutableDictionary、NSMutableArray、NSMutableString 。
(三)拷贝实现(非容器类)(main 在非ARC下打印地址)
结果:
由此可知,复制非容器类对象时,copy是指针复制,即浅拷贝。而mutableCopy是对象拷贝,即深拷贝。
(四)拷贝实现(容器类)(main 在非ARC下打印地址)
-
(1)copy
实现协议时,对象用copy:
实现协议时,对象用mutableCopy:
对于容器类对象,copy将容器对象复制了,但容器里的对象与非容器一样,copy在这里只是指针复制,mutableCopy是对象复制。
(2)mutableCopy
实现协议时,对象用copy:
实现协议时,对象用赋值法:
实现协议时,对象用mutableCopy:
结论:
对于容器类对象,mutableCopy也将容器对象复制了,但容器里的对象与非容器一样,copy在这里只是指针复制,mutableCopy是对象复制。还有,赋值法默认是copy,即浅拷贝。