01
copy的目的就是为了产生一个新的副本对象,修改副本对象,不会对影响原来的对象
IOS提供了两个拷贝方法,
- copy不可变拷贝,产生不可变的副本
2.mutablecCopy,产生可变的副本
NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
NSString *str2 = [testStr copy];//不可变
NSMutableString *str3 = [testStr mutableCopy];//可变
02深拷贝和浅拷贝
通过copy产生的新的对象,相当于alloc出来的对象
NSMutableString *testStr = [NSMutableString stringWithFormat:@"ddd"];
NSString *str2 = [testStr copy];//不可变
NSMutableString *str3 = [testStr mutableCopy];//可变
[testStr release];
[str2 release];
[str3 release
copy出来的新对象
copy的目的就是为了产生一个新的对象,修改互不影响,但是str1指向的是一个不可变的对象,所以copy出的也是一个不可变的对象,
不可变对象copy新的对象还是指向原来的对象,相当于return
- 深拷贝和浅拷贝
- 深拷贝,内容拷贝会产生新的对象,
2.浅拷贝,指针拷贝,不会产生新的对象
03taggedPointer与拷贝
如果字符串是taggedPointer,他就不是真正的对象,那么饮用计数就不存在
04NSArray和NSDictionary
NSMutableArray *arr = [NSMutableArray array];
NSArray *arr2 = [arr copy];//深拷贝
NSMutableArray *arr3 = [arr mutableCopy];//深拷贝
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name" ,nil];
NSDictionary *dic2 = [dic copy];//浅拷贝
NSMutableDictionary *dic3 = [dic mutableCopy];//深拷贝
copy和mutableCopy
可变对象调用mutableCopy肯定是深拷贝,
不可变对象调用copy是浅拷贝,其他都是深拷贝
05@property copy
- (void)setData:(NSData *)data
{
if (_data != data)
{
[_data release];
_data = [data copy];
}
}
但是如果是个可变的数组,执行copy策略,会报错,因为他是一个深拷贝,会生成一个不可变的数组
创建IOS项目,字符串都是copy策略,他可以保证,这个字符串,肯定是不可变的,如果你想要改属性,就直接将整属性赋值一个新的文字,不希望他去修改原来的字符串
06 自定义copy
比如一个对象,已经有很多个属性被赋值,想直接生成一个新对象,含有他的那些属性值这时候就可以使用copy,
关于可变和不可变只存在foundation框架中的类,其他对象是没有的,属性都是通用的所有不存在可变的copy策略,
我们自定义的对象直接使用copy的话会报错,copyWithZone方法没有实现的错误,自定义的类要想copy首先需要遵守,NSCopying
协议,然后实现copyWithZone
方法
- (id)copyWithZone:(struct _NSZone *)zone
{
Person *p = [[Person alloc] init];
p.age = self.age;
p.name = self.name;
return p;
}
不存在mutableCopy策略
网友评论