iOS 中 Copy 与 MutableCopy 简单理解
2018-02-28 本文已影响532人
iOS_肖晨
关于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];