天天看點

iOS 記憶體管理~非集合對象的copy和mutableCopy

//聯系人:石虎  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
不可變對象 淺  深 
可變對象 深  深 

謝謝!!!