//聯系人:石虎 QQ: 1224614774昵稱:嗡嘛呢叭咪哄
一、非集合&不可變
系統非集合類對象指的是,
NSString
NSNumber
... 之類的對象。下面先看個非集合類immutable對象拷貝的例子
NSString* str = @"test string";
NSString* strCy = [str copy];
NSMutableString* strMCy = [strCymutableCopy];
//! 列印輸出
NSLog(@" str :%p %p", str, &str);
NSLog(@" strCy :%p %p", strCy, &strCy);
NSLog(@"strMCy :%p %p", strMCy, &strMCy);
//!
str :0x100001040 0x7fff5fbff7e8
strCy :0x100001040 0x7fff5fbff7e0
strMCy :0x1004002f0 0x7fff5fbff7d8
列印結果:
str和strCy的位址是相同的,是以進行了指針拷貝即淺拷貝
str和strMCy的位址是不同的,是以進行了内容拷貝即深拷貝
二、非集合&可變
//! Test 1
NSMutableString* str = [NSMutableString stringWithString:@"m1Str test"];
NSString* strCy = [str copy];
NSMutableString* mStrCy = [str copy];
NSMutableString* mStrMCy = [str mutableCopy];
NSLog(@" str :%p %p", str, &str);
NSLog(@" strCy :%p %p", strCy, &strCy);
NSLog(@" mStrCy :%p %p", mStrCy, &mStrCy);
NSLog(@"mStrMCy :%p %p", mStrMCy, &mStrMCy);
//!
str :0x100308bd0 0x7fff5fbff7e8
strCy :0xdea10af20184a5 0x7fff5fbff7e0
mStrCy :0xdea10af20184a5 0x7fff5fbff7d8
mStrMCy :0x100308df0 0x7fff5fbff7d0
//! Test 2
[mStrCy appendString:@"mstr append"]; // **Crash**
[str appendString:@" str "];
[mStrMCy appendString:@" mStrMCy "];
從Test 1可以看出非集合&可變對象無論是copy還是mutableCopy,都是内容拷貝深拷貝。
Test 2中會出現Crash,原因就是因為mStrCy雖然是可變對象,但是所對應的内容是copy而來的不可變對象。
三、非集合拷貝結論
從三個demo列印結果可以定論:
非集合 copy mutableCopy 不可變對象 淺 深 可變對象 深 深
謝謝!!!