OC中的copy属性,其实就是浅拷贝,会生成一个新的副本,但只是地址拷贝,修改源文件并不会影响副本,同样的,修改副本也不会影响源文件。由于OC属性中没有mutableCopy属性,所以@property (nonatomic,copy)NSMutableString *str,也是浅拷贝,并没有新分配内存空间,这也是很容易搞错的地方。即该属性声明是一个不可变字符串。
因为是地址拷贝,因此在某种意义上相当于一次retain,引用计数会+1。如果需要深拷贝,那么你必须自己去实现!
NSObject类中的copy方法和mutableCopy方法的实现大致如下:
- (id)copy{
return [self copyWithZone:NULL];
}
-(id)mutableCopy{
return [self mutableCopyWithZone:NULL];
}
由上面可以看出来,如果要自定义copy方法,必须要实现copyWithZone:和mutableCopyWithZone:方法。
这两个方法实现的前提是要遵守<NSCopying>和<NSMutableCopying>协议。
以NSString为例,它的copyWithZone:方法示例如下:
-(id) copyWithZone:(NSZone *)zone
{
return self;
}
|