pragma mark Copy基本使用(深浅拷贝)
pragma mark 概念
/**
一、copy基本概念
1.什么是copy
copy的字面意思 “复制”、“拷贝” 是一个产生副本的过程
2.常见的复制有: 文件复制
作用: 利用一个 源文件 产生一个副本文件
特点:
修改源文件的内容,不会影响副本文件
修改副本文件的内容, 不会影响文件
OC中的copy
作用:利用一个源对象 产生一个副本对象
特点:
修改源对象的 属性 和 行为, 不会影响 副本对象
修改副本对象的 属性 和 行为, 不会影响 源对象
二、copy的使用
如何使用copy功能
一个对象 可以调用copy 或者 mutableCopy 方法创建一个副本对象
copy: 创建的是 不可变副本 (如:NSString、NSArray、NSDictionary)
mutableCopy: 创建的是 可变副本(如:NSMutableString、NSMutableArray、NSMutableDictionary)
使用copy功能的前提
copy: 需要遵守 NSCopying协议,实现copyWithZone方法
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
使用mutableCopy的前提
需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
三、深复制、浅复制
(一句话 不可变 对 不可变 进行 copy 不产生新的对象 是浅拷贝)
(其他的 都会产生 新的对象 所以 都是深拷贝 )
---------------
(1....)浅复制 (浅拷贝,指针拷贝、shallow copy)
源对象 和 副本对象都是 同一个对象
源对象 (副本对象) 引用计数器 +1 , 相当于 做了 retain操作
本质 : 没有产生新的对象
代码 不可变 对 不可变 进行 copy
NSString *srcStr3 = @"lyhhh";
NSString *copyStr3 = [srcStr3 copy];
NSLog(@"4.浅拷贝 ---- %p,%p",srcStr3, copyStr3);
---------------
(2....)深复制 (深拷贝、内存拷贝、deep copy)
源对象 和 副本对象是不同的两个对象
源对象 引用计数器 不变 , 副本对象计数器 + 1 (因为是新产生的对象 )
本质 : 产生了新的对象
代码1 不可变 对 可变 进行 mutableCopy
NSString *srcStr = @"lyh";
NSMutableString *copyStr = [srcStr mutableCopy]; // 调用 mutableCopy 会产生 一个 NSMutableString
NSLog(@"srcStr = %@,copyStr = %@",srcStr,copyStr);
NSLog(@"%p,%p",srcStr, copyStr);
NSLog(@"--------");
代码2 可变 对 可变 进行 mutableCopy
NSMutableString *srcStr1 = [NSMutableString stringWithFormat:@"lyh"];
NSMutableString *copyStr1 = [srcStr1 mutableCopy];
[srcStr1 appendString:@" cool"];
NSLog(@"srcStr1 = %@,copyStr1 = %@",srcStr1,copyStr1);
NSLog(@"%p,%p",srcStr1, copyStr1);
NSLog(@"--------");
代码3 可变 对 不可变 进行 copy
NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lyh"];
NSString *copyStr2 = [srcStr2 copy];
[srcStr2 appendString:@" cool"];
NSLog(@"srcStr2 = %@,copyStr2 = %@",srcStr2,copyStr2);
NSLog(@"%p,%p",srcStr2, copyStr2);
NSLog(@"--------");
*/
pragma mark 代码
#import <Foundation/Foundation.h>
#pragma mark 类
#pragma mark main函数
int main(int argc, const char * argv[])
{
#pragma Copy基本使用(深浅拷贝)
#pragma mark 深拷贝
#warning 1.
// 会生成一个新的对象
NSString *srcStr = @"lyh";
// 只要是 拷贝出来的对象, 拷贝出来的对象 的内容 和 以前对象中的内容一致
// "一般"情况 拷贝会生成一个新的对象
// 为什么会产生 一个新的对象 1.因为 拷贝 要求修改原来的对象 不能影响到 拷贝出来的对象 \
修改拷贝出来的对象 也不能影响到 原来的对象, 所以需要生成 一个新的对象 \
2. 由于 以前的对象 是 一个不可变的对象, 而通过mutableCopy 拷贝出来的对象 必须 是一个可变的对象,所以必须生成一个新的对象
NSMutableString *copyStr = [srcStr mutableCopy]; // 调用 mutableCopy 会产生 一个 NSMutableString
NSLog(@"srcStr = %@,copyStr = %@",srcStr,copyStr);
NSLog(@"%p,%p",srcStr, copyStr);
NSLog(@"--------");
#warning 2.
// 会生成一个新的对象
NSMutableString *srcStr1 = [NSMutableString stringWithFormat:@"lyh"];
NSMutableString *copyStr1 = [srcStr1 mutableCopy];
[srcStr1 appendString:@" cool"];
NSLog(@"srcStr1 = %@,copyStr1 = %@",srcStr1,copyStr1);
NSLog(@"%p,%p",srcStr1, copyStr1);
NSLog(@"--------");
#warning 3.
// 会生成一个新的对象
NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lyh"];
NSString *copyStr2 = [srcStr2 copy];
[srcStr2 appendString:@" cool"];
NSLog(@"srcStr2 = %@,copyStr2 = %@",srcStr2,copyStr2);
NSLog(@"%p,%p",srcStr2, copyStr2);
NSLog(@"--------");
#pragma mark 浅拷贝
#warning 4.
/**
正是 因为调用copy方法有时候会生成 一个新的对象, 有时候不会生成 一个新的对象
所以 : 如果没有生成 新的对象 , 我们称之为 浅拷贝, (本质 就是 指针拷贝)
如果生成了新的对象, 我们陈志伟 深拷贝 , 本质就是 会创建一个新的对象
*/
// 如果是 通过 不可变对象 调用了 copy, 那么不会生成一个新的对象
// 原因: 因为 原来的对象 是不能修改的, 拷贝出来的对象 也是不能修改的
// 既然 两个都不能修改, 所以 永远不能影响到 另外一个对象, 那么已经符合需求了
// 所以 : OC为了对 内容进行优化, 就不会生成一个新的对象
NSString *srcStr3 = @"lyhhh";
NSString *copyStr3 = [srcStr3 copy];
NSLog(@"4.浅拷贝 ---- %p,%p",srcStr3, copyStr3);
return 0;
}
网友评论