今天重新温习了一下object中的copy,并做了几个例子验证,发现有些跟网上说的不太一样,未免再被误导,特此记录一下。
object中包含深拷贝与浅拷贝,即mutableCopy和copy。
简单记一下结论:
一个对象能用copy方法,需要实现NSCopying的协议,大部分的不可变对象,仍然是同一指针,计数加一,copy与retain效果相同。例如NSDictionary、NSDate、NSData、NSNumber等等,它们的协议实现类似于:
- -(id) copyWithZone: (NSZone*) zone
- {
- return [self retain];
- }
要向一个对象发mutableCopy消息,必须实现NSMutableCopying协议。
对一些非容器类(字典,NSArray等)的实例时,发送mutableCopy消息,可创建一个新的对象。
而对一些容器类的实例,可变容器+copy,产生一个不可变容器,不可变容器+mutable,产生一个可变容器。
property中的copy关键字应该不是mutalblecopy