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的更多相关文章

  1. copy之深浅拷贝

    深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...

  2. Python 从零学起(纯基础) 笔记 之 深浅拷贝

    深浅拷贝 1. import  copy#浅拷贝copy.copy()#深拷贝copy.deepcopy()#赋值 = 2.   对于数字和字符串而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个 ...

  3. Python之深浅拷贝&函数

    一.深浅拷贝 深浅拷贝是指copy模块下的copy()和deepcopy()方法. 1.浅拷贝 示例: >>> import copy >>> a = 'hello ...

  4. python高级-深浅拷贝(16)

    一.浅拷贝 浅拷贝是对一个对象的顶层拷贝,通俗地讲就是:拷贝了引用,并没有拷贝内容. a = [1,2,3] print(id(a)) b=a print(b) print(id(b)) a.appe ...

  5. python之路(三)-深浅拷贝

    深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所 ...

  6. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  7. 简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  8. Python:深浅拷贝

    导入模块: >>> import copy 深浅拷贝: >>> X = copy.copy(Y) #浅拷贝:只拷贝顶级的对象,或者说:父级对象 >>&g ...

  9. Python基础:深浅拷贝

    对于数字.字符串深浅拷贝: import copy num = 0 copy_num = copy.copy(num) print("These are normal copy") ...

随机推荐

  1. 解析innodb中的MVCC

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  2. docker: manifest for elasticsearch:latest not found

    今天在docker安装es出现坑,是这样. 使用: docker pull elasticsearch 提示:manifest for elasticsearch:latest not found如图 ...

  3. canvas之事件交互效果isPointPath

    isPointInPath() 用来检测某个点是否在当前路径中,常用来做点击交互等. 需要注意的是,每次执行一次beginPath方法,检测路径就变成这次beginPath之后绘制的路径,原来的路径不 ...

  4. CSS学习笔记-背景属性

    一.背景尺寸属性:    1.含义:        背景尺寸属性是CSS3中新增的一个属性,专门用于设置背景图片大小 2.格式:        1.1具体像素:             backgro ...

  5. 微信小程序获取input输入框内容

    1.wxml <input class="weui-input" type='number' bindinput="emailInput"/>   ...

  6. 使用 vs code 创建 Django 项目

    操作流程: 1.前期准备工作 2.vs code配置Python环境 3.新建 Django 项目 4.vs code 配置 Debug Django 环境 5.浏览器查看效果 1.前期准备工作 安装 ...

  7. driver.find_element_by_xpath.clear()无法清空输入框默认值

    输入框带默认值,想删除默认值,填写新内容,使用clear()再send_keys(), 发现这种方式无法清除,只会在默认值后面追加新的内容. 上网搜了一下,有两种解决方案,如下: 方法一: 先双击,后 ...

  8. 机器学习--支持向量机 (SVM)算法的原理及优缺点

    一.支持向量机 (SVM)算法的原理 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析.它是将向量映射到一个更高维的 ...

  9. MySQL Explain详解 查看mysql语句详情

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有 ...

  10. acWing 825. 排队购物

    题目描述苏西小朋友和她的妈妈正在超市里购物,看着收银处排着的长长的队伍,她就想如何能够提高整体的服务质量呢? 已知,现在有n个人正在排队等待结账,每个人结账所花的时间都可能是不同的,第 i 个人的结账 ...