属性修饰copy;copy、mutableCopy;NSCopying NSMutableCopying
2016-08-22 10:08
387 查看
深拷贝和浅拷贝的区别是,深拷贝是开辟新的内存,创建一个新的对象,即深拷贝产生的对象,与被拷贝的对象没有必然联系。
浅拷贝是拷贝当前对象的地址,即拷贝出来的对象的指针和被拷贝的对象的指针相同,当一个对象被修改的时候,另一个对象从相同的地址取到的内容也会被修改。
NSCopying, NSMutableCopying协议是指,当你想要在自定义类中使用copy,或者mutableCopy的时候,需要实现-(id)copyWithZone(NSZone *)zone
或者- (id)mutableCopyWithZone:(NSZone *)zone这两个方法,而且在创建对象的时候要用[self class]来创建,因为在子类中可能新的属性存在,导致还是父类。
copy和mutableCopy在NSString和NSArray等类中有广泛的使用,具体是深拷贝还是浅拷贝,自己试一下,打印一下地址看一下就了解了,具体代码在下面,感兴趣的可以自己试一下。
NSString *str1 = [NSString
stringWithFormat:@"string"];
NSString *string2 = [str1
mutableCopy];
NSMutableString *str2 = [str1
copy];
// 将一个不可变字符串赋值给一个可变字符串,当修改 str2
时,爆炸。。。。
str1 = [str1 stringByAppendingString:@"1"];
NSLog(@"(%@)地址:%p",
string2, string2);
NSLog(@"(%@)地址:%p",
str1, str1);
NSLog(@"(%@)地址:%p",
str2, str2);
(string)地址:0x600000070dc0
(string1)地址:0x600000051ee0
(string)地址:0xa00676e697274736
当执行str1 copy 时,str2 指向该 [b]0x600000051ee0 地址的对象,当执行 str1 = [str1 stringByAppendingString:@"1"];时,[/b]
str1 已经不再指向该 0x600000051ee0 地址的对象,而是指向[b]0xa00676e697274736地址下的对象。[/b]
在oc中,= 是用来传递地址的,[str1 stringByAppendingString:@"1"]是一个新的对象,有一个新的地址。
浅拷贝是拷贝当前对象的地址,即拷贝出来的对象的指针和被拷贝的对象的指针相同,当一个对象被修改的时候,另一个对象从相同的地址取到的内容也会被修改。
NSCopying, NSMutableCopying协议是指,当你想要在自定义类中使用copy,或者mutableCopy的时候,需要实现-(id)copyWithZone(NSZone *)zone
或者- (id)mutableCopyWithZone:(NSZone *)zone这两个方法,而且在创建对象的时候要用[self class]来创建,因为在子类中可能新的属性存在,导致还是父类。
copy和mutableCopy在NSString和NSArray等类中有广泛的使用,具体是深拷贝还是浅拷贝,自己试一下,打印一下地址看一下就了解了,具体代码在下面,感兴趣的可以自己试一下。
NSString *str1 = [NSString
stringWithFormat:@"string"];
NSString *string2 = [str1
mutableCopy];
NSMutableString *str2 = [str1
copy];
// 将一个不可变字符串赋值给一个可变字符串,当修改 str2
时,爆炸。。。。
str1 = [str1 stringByAppendingString:@"1"];
NSLog(@"(%@)地址:%p",
string2, string2);
NSLog(@"(%@)地址:%p",
str1, str1);
NSLog(@"(%@)地址:%p",
str2, str2);
(string)地址:0x600000070dc0
(string1)地址:0x600000051ee0
(string)地址:0xa00676e697274736
当执行str1 copy 时,str2 指向该 [b]0x600000051ee0 地址的对象,当执行 str1 = [str1 stringByAppendingString:@"1"];时,[/b]
str1 已经不再指向该 0x600000051ee0 地址的对象,而是指向[b]0xa00676e697274736地址下的对象。[/b]
在oc中,= 是用来传递地址的,[str1 stringByAppendingString:@"1"]是一个新的对象,有一个新的地址。
相关文章推荐
- 19 NSCopying与NSMutableCopying协议+深复制和浅复制
- iOS模型copy < NSCopying, NSMutableCopying >实现
- Object-C对象复制:copy与mutableCopy、NScopying与NSMutableCopy
- iOS 杂笔-25(不要用copy修饰NSMutableString)
- [bugfix]copy属性参数将NSMutableArray变为NSArray类型
- NSData (NSObject) <NSCopying, NSObject, NSSecureCoding, NSMutableCopying>
- NSMutableArray 被copy、strong修饰后的变化
- NSCopying和NSMutableCopying协议
- ios开发——NSCopying与NSMutableCopying协议
- NSString,NSArray,NSMutableArray分别用什么属性修饰,原因是什么?
- nsmutablestring 属性声明为copy程序崩溃了
- 浅谈iOS中几个常用协议 NSCopying/NSMutableCopying
- tips: NSCopying和NSMutableCopying
- 对象的拷贝(NSCopying/NSMutableCopying)
- NSCopying和NSMutableCopying协议
- foundation——NSCopying NSMutableCopying
- NSCopying/NSMutableCopying
- 给NSMutableArray添加copy属性就变成了NSArray
- iOS内存管理(6)--NSArray与NSMutableArray用copy修饰还是strong
- copy assign retain 修饰属性的set 方法