不管是集合類(lèi)對(duì)象(NSArray慧邮、NSDictionary、NSSet ... 之類(lèi)的對(duì)象)舟陆,還是非集合類(lèi)對(duì)象(NSString, NSNumber ... 之類(lèi)的對(duì)象)误澳,接收到copy和mutableCopy消息時(shí),都遵循以下準(zhǔn)則:
1. copy 返回的是不可變對(duì)象(immutableObject)秦躯;如果用copy返回值調(diào)用mutable對(duì)象的方法就會(huì)crash忆谓。
2. mutableCopy 返回的是可變對(duì)象(mutableObject)。
3.無(wú)論是集合對(duì)象還是非集合的對(duì)象踱承,對(duì)不可變對(duì)象進(jìn)行copy操作倡缠,是指針復(fù)制,mutableCopy操作是內(nèi)容復(fù)制勾扭;對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制毡琉。
一铁瞒、非集合類(lèi)對(duì)象的copy與mutableCopy
? 在非集合類(lèi)對(duì)象中妙色,對(duì)不可變對(duì)象進(jìn)行copy操作,是指針復(fù)制慧耍,mutableCopy操作是內(nèi)容復(fù)制身辨;
? 對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制。用代碼簡(jiǎn)單表示如下:
NSString *str = @"hello word!";
NSString *strCopy = [str copy] // 指針復(fù)制芍碧,strCopy與str的地址一樣
NSMutableString *strMCopy = [str mutableCopy] // 內(nèi)容復(fù)制煌珊,strMCopy與str的地址不一樣
NSMutableString *mutableStr = [NSMutableString stringWithString: @"hello word!"];
NSString *strCopy = [mutableStr copy] // 內(nèi)容復(fù)制
NSMutableString *strMCopy = [mutableStr mutableCopy] // 內(nèi)容復(fù)制
二、集合類(lèi)對(duì)象的copy與mutableCopy (同上)
? 在集合類(lèi)對(duì)象中泌豆,對(duì)不可變對(duì)象進(jìn)行copy操作定庵,是指針復(fù)制,mutableCopy操作是內(nèi)容復(fù)制踪危;
? 對(duì)可變對(duì)象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制蔬浙。但是:集合對(duì)象的內(nèi)容復(fù)制僅限于對(duì)象本身,對(duì)集合內(nèi)的對(duì)象元素仍然是指針復(fù)制贞远。(即單層內(nèi)容復(fù)制)
? ? NSArray *arr = @[@[@"a", @"b"], @[@"c", @"d"];
? ? NSArray *copyArr = [arr copy]; // 指針復(fù)制
? ? NSMutableArray *mCopyArr = [arr mutableCopy]; //單層內(nèi)容復(fù)制
? ? NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
? ? NSArray *copyArr = [mutableArr copy]; // 單層內(nèi)容復(fù)制
? ? NSMutableArray *mCopyArr = [mutableArr mutableCopy]; // 單層內(nèi)容復(fù)制
【總結(jié)一句話(huà)】:
只有對(duì)不可變對(duì)象進(jìn)行copy操作是指針復(fù)制(淺復(fù)制)畴博,其它情況都是內(nèi)容復(fù)制(深復(fù)制)!