在ios中并非所有的對(duì)象都支持copy和mutableCopy,只有遵守NSCopying協(xié)議的對(duì)象才能發(fā)送copy消息,同理遵守NSMutableCopying協(xié)議的類才能發(fā)發(fā)送mutableCopy消息。并實(shí)現(xiàn)它們各自的copyWithZone和mutableCopyWithZone方法。
淺拷貝copy:
淺拷貝產(chǎn)生的新對(duì)象和源對(duì)象共享同一個(gè)內(nèi)存空間,也就是所謂的指針復(fù)制,當(dāng)內(nèi)存銷毀的時(shí)候,指向這片內(nèi)存的指針需要重新定義才能使用,否則會(huì)成為野指針。
-(void)shallowCopy{
NSArray *someArr = [NSArray arrayWithObjects:@"Elena",@"Jane",@"Tome" ,nil];
NSArray *shallowCopyArr = [someArr copyWithZone:nil];
NSLog(@"\nsomeArr = %p,\nshallowCopyArr = %p",someArr,shallowCopyArr);
NSDictionary *someDic = [NSDictionary dictionaryWithObjectsAndKeys:@"item1",@"Elena",@"item2",@"Tome", nil];
NSDictionary *shallowCopyDic = [[NSDictionary alloc] initWithDictionary:someDic copyItems:NO];
NSLog(@"\nsomeDic = %p,\nshallowCopyDic = %p",someDic,shallowCopyDic);
}
打印結(jié)果:

a-2.png
深拷貝mutableCopy:
深拷貝產(chǎn)生的對(duì)象其內(nèi)存空間是自主分配的,雖然新對(duì)象的值與源對(duì)象相同但是內(nèi)存地址不一樣(對(duì)象復(fù)制),因此兩者互不影響,互不干涉。

a-1.png