iOS 中 Copy 与 MutableCopy 简单理解

关于iOS常见类型(NSString、NSArray以及NSDictionary)的copy方法理解

概念简介

  • 浅复制:只拷贝内存地址的指针,不开辟新的内存。
  • 深复制:开辟新的内存,创建指向新的内存地址的指针。
  • false深复制:对可变对象进行copy的时候生成的不可变对象,开辟了新的内存,但是对象本身性质发生了改变。

简单记忆

  • 不可变对象 + copy = 浅复制
  • 不可变对象 + mutableCopy = 深复制
  • 可变对象 + copy = false深复制
  • 可变对象 + mutableCopy = 深复制

以下为单独介绍部分

NSString 与 NSMutableString

  • 代码
// __NSCFConstantString : 0x1037faa48
NSString *s1 = @"321321321"; 

// __NSCFConstantString : 0x1037faa48,浅复制,只拷贝指针
NSString *cs1 = [s1 copy]; 
 
// __NSCFString : 0x604000449780,深复制,开辟新的内存地址,不可变字符串 -> 可变字符串
NSMutableString *ms1 = [s1 mutableCopy]; 

// __NSCFString : 0x604000449780,方法变相证明了 NSString 通过 mutableCopy 生成了一个新的可变字符串
[ms1 appendString:@"0000"]; 

// __NSCFString : 0x60000005e330
NSMutableString *ms = [NSMutableString stringWithString:@"fdasfda"]; 

// NSTaggedPointerString : 0xa616466736164667,false深复制,开辟新的内存地址,可变字符串 -> 不可变字符串,如果执行可变字符串方法会崩溃 
NSString *cms = [ms copy]; 

// __NSCFString : 0x600000443000,深复制,开辟新的内存地址
NSMutableString *mms = [ms mutableCopy]; 

NSArray 与 NSMutableArray

  • 代码
// __NSArrayI 0x604000221700
NSArray *a = @[@1, @2]; 

// __NSArrayI 0x604000221700,浅复制,只拷贝指针 
NSArray *ca = [a copy]; 

// __NSArrayM 0x60400024e010,深复制,开辟新的内存地址,不可变数组 -> 可变数组 
NSMutableArray *ma = [a mutableCopy]; 

// __NSArrayM 0x60400024e010,方法变相证明了 NSArray 通过 mutableCopy 生成了一个新的可变数组
[ma addObject:@3]; 

// __NSArrayM 0x600000246e40
NSMutableArray *m = [NSMutableArray arrayWithObjects:@"a", @"b", nil]; 

// __NSArrayI 0x600000039040,false深复制,可变数组 -> 不可变数组,如果执行可变数组方法会崩溃 
NSArray *cm = [m copy]; 

// __NSArrayM 0x600000246ea0,深复制,开辟新的内存地址 
NSMutableArray *mm = [m mutableCopy]; 

NSDictionary 与 NSMutableDictionary

  • 代码
// __NSDictionaryI : 0x60400027f8c0
NSDictionary *d = @{@"aa": @(11), @"bb": @(22)}; 

// __NSDictionaryI : 0x60400027f8c0,浅复制,只拷贝指针
NSDictionary *cd = [d copy]; 

// __NSDictionaryM : 0x604000039260,深复制,开辟新的内存地址,不可变字典 -> 可变字典
NSMutableDictionary *md = [d mutableCopy]; 

// __NSDictionaryM : 0x604000039260,方法变相证明了 NSDictionary 通过 mutableCopy 生成了一个新的可变字典
[md setObject:@(33) forKey:@"cc"]; 

// __NSDictionaryM : 0x604000039460
NSMutableDictionary *m = [NSMutableDictionary dictionaryWithDictionary:@{@"gg": @(88), @"hh": @(99)}]; 

// __NSFrozenDictionaryM : 0x6040000394e0,false深复制,开辟新的内存地址,可变字典 -> 不可变字典,如果执行可变字典方法会崩溃
NSDictionary *cm = [m copy]; 

// __NSDictionaryM : 0x6040000394a0,深复制,开辟新的内存地址
NSMutableDictionary *mm = [m mutableCopy]; 

推荐阅读更多精彩内容

  • 前言 不敢说覆盖OC中所有copy的知识点,但最起码是目前最全的最新的一篇关于 copy的技术文档了。后续发现有新...
    zyydeveloper阅读 1,306评论 4 26
  • 先说下概念,我们对变量的复制,其实就是在写代码的过程中,再定义多几个不同名字的变量,让他们都“等于”某一个变量,这...
    TonyGor阅读 13评论 0 0
  • 1、对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接...
    滴答大阅读 258评论 0 2
  • 参考文献《招聘一个靠谱的iOS》 深拷贝和浅拷贝 由上面的图我们可以明确地看出, 浅拷贝(Shallow copy...
    Terrnce阅读 579评论 2 8
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    sumrain_cloud阅读 134评论 0 1