copy的特点:
修改源对象的属性和行为,不会影响副本对象
修改副本对象的属性和行为,不会影响源对象
浅拷贝只拷贝了地址, 深拷贝拷贝了地址和内容
浅拷贝好比你的影子,你死了,影子也没了;
深拷贝好比克隆人,你死了,它还在。
NSString *str1 = @"非容器不可变对象";
NSString *str2 = [str1 copy]; 得到的 NSMutableString 没有开辟内存空间, 只是复制了地址
NSString *str3 = [str1 mutableCopy]; 得到的 NSString
NSMutableString *str1 = [NSMutableString stringWithFormat:@"非容器可变对象"];
NSMutableString *str2 = [str1 copy]; NSString
NSMutableString *str3 = [str1 mutableCopy]; NSString
用copy修饰的 或者赋值的 变量肯定是不可变的。
用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
对象之间赋值之后,再改变,遵循互不影响的原则
1)、当源对象是不可变类型的时候,使用copy操作,得到的还是不可变类型副本,并且副本内存地址(指针)和源对象的内存地址是一样的,可以认为源对象和副本对象是同一对象,并没有产生新对象,相当于是执行了一次retain操作,这样的copy操作,叫做浅拷贝,也有人叫指针拷贝;
2)、当源对象是可变类型的时候,使用copy操作得到的是不可变类型副本。类型不一样,内存地址也肯定不一样,即在内存中分配了新的地址空间,产生了新的对象。虽然内存地址不一样,但两者的内容是一样的,这样的copy操作,叫做深拷贝,也有人这叫做内容拷贝;
3)、当源对象是不可变类型,使用mutableCopy操作,得到的副本对象是可变类型。一个可变,一个不可变,类型不一样,内存地址也不一样,产生了新的对象,所以也是深拷贝;
4)、当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型。这个时候源对象和副本对象的内存地址是否一样?是否产生了新的对象?上面提到过,使用复制的目的是,改变源对象,副本对象的内容不跟着改变,根据这个原则,两个可变类型对象,要想一个改变不影响另外一个,只能是两个不同的对象,指向不同的内存地址。所以,当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型,这个副本是新的对象,也是深拷贝;
NSString *str2 = [str1 copy]; NSString 浅拷贝
NSMutableString *str2 = [str1 copy]; NSString 深拷贝
NSString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝
NSMutableString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝
copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝
网友评论