深浅拷贝的应用-copy、mutableCopy
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
//如果想让list成为一个可变的数组,需要把copy变成retain,因为copy之后的对象永远都只是一个不可变的对象
@property (nonatomic,copy)NSMutableArray *list;
@end
ViewController.m
/*
拷贝:复制一个对象->变成另外一个对象
深拷贝:复制对象并且复制对象里面的内容,完全拷贝
浅拷贝:指针拷贝,只拷贝对象本身,不拷贝里面的内容
看是不是深拷贝,主要看是不是拷贝了对象里面的内容
系统自带的拷贝都是浅拷贝,eg:copy、mutableCopy
实现深拷贝的方式:
1、自定义拷贝(要看具体拷贝内容的实现)
2、系统提供给了深拷贝的方法
(1)数组:- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag
(2)字典:- (instancetype)initWithDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary copyItems:(BOOL)flag
自定义拷贝:
1、copyWithZone:
2、mutableCopyWithZone:
并不是所有对象都可以拷贝 ->只有遵守了拷贝协议的对象才可拷贝
mutableCopy:?深浅拷贝
指针拷贝 ->浅拷贝
对象拷贝 ->深拷贝
mutableCopy ->深拷贝
在使用mutableCopy 拷贝后两个对象的内存地址是不一样的
拷贝对象的内容 的内存地址是否发生改变 ->mutableCopy属于浅拷贝
*/
#import "ViewController.h"
#import "UserInfoModel.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UserInfoModel *red = [[UserInfoModel alloc]init];
UserInfoModel *yellow = [[UserInfoModel alloc]init];
UserInfoModel *blue = [[UserInfoModel alloc]init];
NSArray *colorList = @[red,yellow,blue];
NSLog(@"拷贝前%p",colorList[0]);
//copyItems 如果设置的是YES就是深拷贝
// NSArray *newList = [[NSArray alloc]initWithArray:colorList copyItems:YES];
NSArray *newList = [colorList mutableCopy];
NSLog(@"拷贝后%p",newList[0]);
// [red copy];
red.list = [NSMutableArray arrayWithObjects:@"1", nil];
[red.list addObject:@"2"];
UserInfoModel *new = [red mutableCopy];
[new.list addObject:@"3"];
/*
copy :拷贝之后的对象是不可变的对象
mutableCopy:拷贝之后的对象是可变的对象,但是必须用对应的类型去接收
*/
//NSArray *list = @[];
// NSMutableArray *newList = [list mutableCopy];
//要想把拷贝之后的对象变成可变的必须用可变的数据类型去接收
// NSArray *newList = [list mutableCopy];
// [newList addObject:@"1"];
/*
**************************************************************
*
*不可变对象 copy ->不可变对象 ->不管用可变或者不可变类型接收 都是不可变
*可变对象 copy ->不可变对象 ->不管用可变或者不可变类型接收 都是不可变
*
*不可变对象 mutableCopy -> 可变对象 ->不可变对象接收 -> 不可变对象
*不可变对象 mutableCopy -> 可变对象 ->可变对象接收 -> 可变对象
*可变对象 mutableCopy -> 可变对象 ->不可变对象接收 -> 不可变对象
*可变对象 mutableCopy -> 可变对象 ->可变对象接收 -> 可变对象
*
**************************************************************
*总结:(1)只要使用copy就是不可变对象
@property (nonatomic,copy)NSMutableArray *list;
在声明可变数组的属性的时候,只要使用copy这个关键字就会变成不可变的数组
原因:在setter方法的实现中全部使用了copy
(2)使用mutableCopy必须使用可变类型接收,才是可变对象
自定义拷贝:
并不是所有类型 都可以拷贝 ->如果想让不可以拷贝的类型实现拷贝 ->自定义拷贝
可以拷贝的数据类型:nsstring nsarray nsdictionary
自定义拷贝的步骤:
1、导入拷贝协议
2、实现协议的方法
(1)copyWithZone:
(2)mutableCopyWithZone:
*/
//不管用什么数据类型接收copy之后的内容,都是一个不可变的对象
// NSArray *list1 = @[];
// NSMutableArray *new1 = [list1 copy];
// [new1 addObject:@"1"]; 会奔溃
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
UserInfoModel.h
#import <Foundation/Foundation.h>
//1、遵守拷贝协议
@interface UserInfoModel : NSObject<NSCopying,NSMutableCopying>
@property(nonatomic,retain)NSMutableArray *list;
@property(nonatomic,retain)NSMutableDictionary *info;
@end
UserInfoModel.m
#import "UserInfoModel.h"
@implementation UserInfoModel
- (id)copyWithZone:(nullable NSZone *)zone
{
//allocWithZone: 是在执行cop的时候分配内存
UserInfoModel *new = [[UserInfoModel allocWithZone:zone]init];
//new是拷贝之后的新的对象
new.list = [self.list copy];
new.info = [self.info copy];
return new;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone
{
UserInfoModel *new = [[UserInfoModel allocWithZone:zone]init];
new.list = [self.list mutableCopy];
new.info = [self.info mutableCopy];
return new;
}
@end
深浅拷贝的应用-copy、mutableCopy的更多相关文章
- copy之深浅拷贝
深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...
- Python 从零学起(纯基础) 笔记 之 深浅拷贝
深浅拷贝 1. import copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2. 对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...
- Python之深浅拷贝&函数
一.深浅拷贝 深浅拷贝是指copy模块下的copy()和deepcopy()方法. 1.浅拷贝 示例: >>> import copy >>> a = 'hello ...
- python高级-深浅拷贝(16)
一.浅拷贝 浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容. a = [1,2,3] print(id(a)) b=a print(b) print(id(b)) a.appe ...
- python之路(三)-深浅拷贝
深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所 ...
- 24、简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- 简述Python的深浅拷贝以及应用场景
深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...
- Python:深浅拷贝
导入模块: >>> import copy 深浅拷贝: >>> X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象 >>&g ...
- Python基础:深浅拷贝
对于数字.字符串深浅拷贝: import copy num = 0 copy_num = copy.copy(num) print("These are normal copy") ...
随机推荐
- python爬虫公众号所有信息,并批量下载公众号视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据分析实战 PS:如有需要Python学习资料的小伙伴可以加点击 ...
- llinux/重启/用户切换/注销
一.指令 shutdown命令 shutdown -h now //立即关机 shutdown -h 2 //分钟后关机 shutdown -r now //立即重启 shutdown -r 1 // ...
- GO-&获取地址与*解引用
&变量 获取变量在内存空间的地址 *变量地址 获取变量的值 一.普通数据 package main import "fmt" func main(){ b :=1111 c ...
- localStorage本地存储技术
localStorage 本地存储技术 本地存储技术,“不是永久的永久存储” 特点: 将数据存储到浏览器当中 存储的数据都是以字符串的形式存储的 和传统的数据库相比: 优点: 操作简单,容易学习 数据 ...
- iOSMultipeerConnectivity使用
MultipeerConnectivity是iOS7推出的多点连接框架,多用于文件传输,类似于iOS设备的airTrop隔空投放,在没有联网的情况下也能聊天传文件. 使用方法,一个设备作为广播开放Pe ...
- angluarjs实现过滤并替换关键字
html样式 <body ng-app="myapp" ng-controller="myCtrl"> <input type="t ...
- IaaS、PaaS、SaaS介绍(非原创)
文章大纲 一.IaaS.PaaS.SaaS介绍与比较二.参考文章 一.IaaS.PaaS.SaaS介绍与比较 随着云计算.大数据.人工智能等一批新技术的涌入,企业信息化建设速度加快,基于云计算的Iaa ...
- SQL Server关于AlwaysOn的理解
(一)SQL Server-AlwaysOn 技术:SQL Server AlwaysOn 即“全面的高可用性和灾难恢复解决方案” 1.数据库级可用性-只读副本:SQL Server 2012-4个, ...
- 『003』Shell命令
『001』索引-Linux Shell Command shell命令 <01>[线上查询及帮助][001]-[001] [001]- 点我快速打开文章[man][help][已改版] & ...
- LINUX上安装JDK+tomcat+mysql操作笔记
1.环境准备: 1-1.centos 64位(本人的虚拟机安装此系统),安装步骤和网络配置已经在前两篇记录. 1-2.JDK 版本1.8 1-3.tomcat压缩包 1-4.CRT远程连接工具(可用其 ...