这是我参与「第四届青训营 」笔记创作活动的的第6天,今天是7月28日,今天继续学习有关OC内存管理的内容,主要学习了浅拷贝和深拷贝,可变和不可变在拷贝时的区别。
浅拷贝和深拷贝
浅拷贝(copy):拷贝的是指针的地址,产生一个新的指针,但与旧指针指向的是同一块内存区域,没有发生内容的拷贝。一般在属性中用于修饰不可变对象,
深拷贝(mutablecopy):拷贝的是内容,产生一个新的指针,但指向的是新的一块内存区域(内容被拷贝到新内存区域),指向新的地址。
可变和不可变
可变对象:对象数据不会被修改,线程安全,查找性能好,用于属性声明或是方法参数
不可变对象:对象数据可被修改,线程不安全,查找性能较差,用于方法内的临时变量,可做增删。
不可变对象进行拷贝
当我们对一个不可变对象进行copy时(以NSString为例),我们会发现它们的地址是一样的。所以是进行了浅拷贝
NSString *str1=@"name";
NSLog(@"str1的地址:%p",str1);
NSString *str2=[str1 copy];//进行str1的copy
NSLog(@"str2的地址:%p",str2);
输出为
当我们对一个不可变对象进行mutablecopy时,我们会发现它与str1的地址不同。所以是进行了深拷贝。
NSString *str1=@"name";
NSLog(@"str1的地址:%p",str1);
NSString *str2=[str1 copy];
NSLog(@"str2的地址:%p",str2);
NSString *str3=[str1 mutableCopy];//进行mutablecopy
NSLog(@"str3的地址:%p",str3);
输出为
深拷贝的本质是在内存里面创建了一个mutablestring的可变对象,并且指针指向mutablestring对象
可变对象进行拷贝
当我们对一个可变对象进行copy时(还是以NSString为例),我们会发现它们的地址是不一样的。所以是进行了深拷贝
NSMutableString *str4=[[NSMutableString alloc] initWithString:@"name"];
NSLog(@"str4的地址:%p",str4);
NSMutableString *str5=[str4 copy];//进行str4的copy
NSLog(@"str5的地址:%p",str5);
输出为
当我们对一个可变对象进行mutablecopy时,我们会发现它与str4的地址不同。所以也是进行了深拷贝。
NSMutableString *str4=[[NSMutableString alloc] initWithString:@"name"];
NSLog(@"str4的地址:%p",str4);
NSMutableString *str5=[str4 copy];
NSLog(@"str5的地址:%p",str5);
NSMutableString *str6=[str4 mutableCopy];//进行str4的mutablecopy
NSLog(@"str6的地址:%p",str6);
输出为
所以可变对象的copy和mutablecopy都是深拷贝。
总结:今天继续学习了剩下的内存管理相关内容,了解到两个不同对象可变对象和不可变对象的两个行为copy和mutablecopy。了解了它们之间的区别