代码分析Objective-C中的深拷贝与浅拷贝

本文详细探讨了Objective-C中深拷贝和浅拷贝的概念,通过实例代码展示了不同对象类型(可变与不可变)调用`copy`和`mutableCopy`方法时的行为。结论是:可变类型调用`copy`和`mutableCopy`均为深拷贝,不可变类型调用`copy`为浅拷贝,调用`mutableCopy`为深拷贝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oc这门语言属于奇葩中的奇葩,基本类型的对象分为“可变”类型与“不可变”类型。

比如下面这些类型

可变 不可变
NSArray NSMutableArray
NSString NSMutableString
NSNumber NSMutableNumber

可变类型可以看作是“变量”,不可变类型可以看作是“常量”。当然,只是表面上比较像。

两种类型都是NSObject的子类,都实现了NSObject中的mutableCopycopy方法。

有关这两种方法,Apple是这样介绍的:

在oc中 copy和mutableCopy两个方法是被所有对象(继承自NSObject的类)继承的,这两个方法就是为copy准备的。其中,mutableCopy是为了创建原始对象的可变类型的copy。这两个方法分别调用copyWithZone和mutableCopyWithZone两个方法来进行copy。一个类必须实现copyWithZone或者mutableCopyWithZone,才能进行copy或者mutableCopy。

两种类型(可变、不可变),两种方法(mutableCopy、copy),就产生了四种组合:

  • 可变类型调用copy
  • 可变类型调用mutableCopy
  • 不可变类型调用copy
  • 不可变类型调用mutableCopy

这四种组合衍生出了两种概念,浅拷贝深拷贝

  • 浅copy: 指针复制,不会创建一个新的对象。
  • 深copy: 内容复制,会创建一个新的对象。

概念太空,用代码来理解:

#import <Foundation/Foundation.h>

int main(int args, const char *argv[]) {
   
    @autoreleasepool 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值