接下來會按照專題的方式,寫一些 iOS 基礎基礎知識的文章,有些是從電腦裏之前的筆記摘出來的。本片文章是關於copy、mutableCopy的總結。安全
先看如下幾段代碼:atom
對 NSString 作 copy、mutableCopy:code
NSString *str1 = @"123"; NSString *copyStr1 = [str1 copy]; NSMutableString *mutableStr1 = [str1 mutableCopy]; NSLog(@"%p",str1); // 0x108159088 NSLog(@"%p",copyStr1); // 0x108159088 NSLog(@"%p",mutableStr1); // 0x60c00024d050
結論:對 NSString 作 copy 獲得的對象地址不變,作mutableCopy,地址會變對象
對 MutableString 作 copy、mutableCopy:string
// NSMutableString NSMutableString *str2 = [NSMutableString stringWithString:@"123"]; NSString *copyStr2 = [str2 copy]; NSMutableString *mutableStr2 = [str2 mutableCopy]; NSLog(@"%p",str2); // 0x60c000245670 NSLog(@"%p",copyStr2); // 0xa000000003332313 NSLog(@"%p",mutableStr2); // 0x60c000245940
結論:對 NSMutableString 作 copy、mutableCopy地址都會變。it
對 NSArray 作 copy、mutableCopy:table
// NSArray NSArray *array1 = [NSArray arrayWithObject:@"1"]; NSArray *copyArray1 = [array1 copy]; NSMutableArray *mutableCopyArray1 = [array1 mutableCopy]; NSLog(@"%p",array1); // 0x60c000015de0 NSLog(@"%p",copyArray1); // 0x60c000015de0 NSLog(@"%p",mutableCopyArray1); // 0x60c0000567a0
結論:對 NSArray 作 copy 獲得的對象地址不變,作mutableCopy,地址會變,和String狀況同樣class
對 NSMutableArray 作 copy、mutableCopy:基礎
// NSMutableArray NSMutableArray *array2 = [NSMutableArray arrayWithObject:@"1"]; NSArray *copyArray2 = [array2 copy]; NSMutableArray *mutableCopyArray2 = [array2 mutableCopy]; NSLog(@"%p",array2); // 0x604000255390 NSLog(@"%p",copyArray2); // 0x60400001c2d0 NSLog(@"%p",mutableCopyArray2); // 0x604000255210
結論:對 NSMutableArray 作 copy、mutableCopy地址都會變。總結
總結一下:
[XXX copy]
好比 @property (nonatomic, copy) NSString *m_string;
因此若是賦值過來的是一個可變對象,也就是對可變對象作copy,會新生成一個對象賦值給 m_string,那麼即便本來的可變對象改變了,也不影響 m_string 的變化。X | copy | mutableCopy |
---|---|---|
可變對象 | 地址不變 | 地址改變 |
不可變對象 | 地址改變 | 地址改變 |