iOS 浅拷贝和深拷贝

2019-05-28  本文已影响0人  7890陈

1、对象拷贝,使用关键字 copy 和 mutableCopy,使用这两个方法即可复制已存在的对象
自定义类想要具备可复制功能,必须实现NSCopying 或 NSMutableCopy
copy 返回的是不可变对象,mutableCopy 返回的是可变对象
让自定义的类具有 copy 和 mutableCopy,这个类需遵守NSCopying、NSMutableCopying协议并实现协议方法
2、浅拷贝只是复制指向对象的指针,不会开辟新的内存空间,两个指针指向同一块内存空间

NSArray *array = [NSArray arrayWithObject:@"1"];
NSLog(@"%p  -- %p",array,[array copy]);
// 0x6000006f6d30 
// 0x6000006f6d30
// %p 打印对象内存地址

3、深拷贝会拷贝对象的具体内容,然后指向一块新的内存地址
常见的几种例子

// 第一种情况 
@property (nonatomic, strong) NSArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 数组内容一样,内存地址一样
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 修改数组后,数组内容一样,内存地址也一样
// 此种情况 为浅拷贝
// 第二种情况 
@property (nonatomic, copy) NSArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 数组内容一样,内存地址不一样
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"%p -- %p",self.list, array);
// 修改数组后,数组内容不一样,内存地址也不一样
// 此种情况为深拷贝
// 第三种情况
@property (nonatomic, strong) NSMutableArray *list;

NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];
self.list = array;
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"\n%p \n%p",self.list, array);
// 数组内容一样,内存地址一样
    
[array addObject:@"2"];
    
NSLog(@"%@ -- %@",self.list, array);
NSLog(@"\n%p \n%p",self.list, array);
// 修改数组后,数组内容一样,内存地址也一样
// 此种情况 为浅拷贝

注意:@property 中可变类型不能使用 copy 修饰,@property 是由 ivar(属性变量) + getter + setter 方法组成的,self.list 会调用 setter 方法,setter 方法中有 _list = [list copy]; 会将可变类型变为不可变类型,self.list 在调用增、删、改等可变对象的方法时,会crash,找不到方法,报错误:unrecognized selector sent to instance 0x600001583330

// 第四种情况
NSArray *list = [NSArray arrayWithObject:@"1"];
NSArray *array = [list copy];
    
NSLog(@"\n%p\n%p",list,array);
// 内存地址一样
// 浅拷贝
// 第五种情况
NSArray *list = [NSArray arrayWithObject:@"1"];
NSMutableArray *array = [list mutableCopy];
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 内容一样,内存地址不一样
    
[array addObject:@"2"];
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,内容不一样,内存地址也不一样
// 深拷贝
// 第六种情况
NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
NSArray *array = [list copy];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 内容一样,内存地址不一样
    
[list addObject:@"2"];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,内容不一样,内存地址也不一样
// 深拷贝
// 第七种情况
NSMutableArray *list = [NSMutableArray arrayWithObject:@"1"];
NSMutableArray *array = [list mutableCopy];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 内容一样,内存地址不一样
    
[list addObject:@"2"];
    
NSLog(@"%@ -- %@",list,array);
NSLog(@"\n%p\n%p",list,array);
// 修改后,内容不一样,内存地址也不一样
// 深拷贝
上一篇下一篇

猜你喜欢

热点阅读