iOS copy mutableCopy 的实现

摘要:
对象可以调用copy或mutableCopy方法来创建复制对象。

一个对象可以调用copy或mutableCopy方法来创建一个副本对象。
1、copy:创建的时不可变副本
(如NSString、NSArray、NSDictionary)。
比如把一个对象添加字典的键值对中时,将导致调用该对象的copy方法,
而copy方法在NSObject中的实现中,将调用该对象的copyWithZone方法(NSCopying协议方法)

所以,可以不用重写copy方法,只需实现copyWithZone即可。
copyWithZone方法应该返回一个不可变副本。
2、mutableCopy:创建的可变副本
(如NSMutableString、NSMutableArray、NSMutableDictionary)

使用copy功能的前提:

1、copy:需要遵守NSCopying协议,
实现copyWithZone:方法。

2、mutableCopy : 需要遵守NSMutableCopying协议,
实现mutableCopyWithZone:

深复制和浅复制的区别:
深复制(深拷贝、内容拷贝、deep copy):

特点:1、源对象和副本对象是不同的两个对象; 

2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。

本质:产生了新对象。

浅复制(浅拷贝、指针拷贝、shallow copy):

特点:1、源对象和副本对象是同一对象; 

2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。

本质:没有产生新对象

不论源对象是否可变,copy复制出的对象都是不可变对象
不论源对象是否可变,mutableCopy复制出的对象都是可变对象
只有不可变对象的copy方式,是浅复制,其他都是深复制。

注意,以上结论仅对于字符串、数组和字典
自定义对象的复制效果取决于对应copy协议方法的实现。

另附模型copy的demo

car.h

#import <Foundation/Foundation.h>

@interface car : NSObject<NSCopying>
@property (nonatomic , copy) NSString * name;
@property (nonatomic,copy) NSString * age;
@end

car.m

#import "car.h"

@implementation car
- (instancetype)copyWithZone:(nullable NSZone *)zone{
    car * tmp = [[car alloc]init];
    tmp.age = self.age;
    tmp.name = self.name;
    return  tmp;
}
@end

现实模型的深拷贝

免责声明:文章转载自《iOS copy mutableCopy 的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Win7/8下Oracle的安装什么是物联网网关?物联网网关具备什么功能?_转下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

电脑不识别USB blaster驱动问题

电脑不识别USB blaster,如下图: 解决办法:手动更新...

PHP 垃圾回收机制(转)

GC进程通常从每个会话开始运行。GC的目的是在会话文件过期__destruct/unset__destruct()析构函数后自动销毁和删除它们。PHP将使用全局变量session.gc_Probability和session.gc_advisor的值session.gc_Probability=1,...

ORACLE无法删除当前连接用户

今天在做Oracle数据库是遇到ORACLE无法删除当前连接用户,经查找可用如下方法解决。SQL˃dropuseracascade;//删除用户以及用户表空间下所有对象用户已丢弃。...

【转载】 银河麒麟V10系统安装U盘制作

在制作U盘安装盘的过程中,Kylin系统的ISO映像文件比较大,因此很耗时。创建完成后,“写入硬盘映像”对话框将自动关闭。...

Oracle的分条件计数COUNT(我的条件),由浅入深

@目录本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle COUNT内置函数。复杂计数。常规操作。中间操作。对中间操作的反思。高级操作。高级操作的修订版本。(你需要根据你的业务知识灵活轮换。)总结。本文涉及关键字COUNT、CASEWHEN和DECODE。Oracle计数。所有操作都基于下表作为操作对象。创建一个名为sqlcreateta...

log4j2

4.日志级别:我们现在将调用logger方法。然而,这个logger对象中有很多方法,所以我们应该首先了解log4j的日志级别,它指定了几个默认级别:trace˂debug˂info˂warn˂error˂false等。电话很简单。log4j的核心在配置文件中。如果我已经定义了日志,我将日志级别更改为TRACE,输出将如下:19:11:36.941TRACE...