MRC Copy 與MutableCopy的區別
拷貝的目的:產生一個副本,跟原物件之間互不影響。即修改原物件(或者副本)不會影響副本(或原物件)。
深拷貝:生成一個新的物件,叫深拷貝
淺拷貝:複製一個新的指標指向同一個物件,叫淺拷貝
NSString *str1 = [[NSString alloc]initWithFormat:@"123"];
//copy mutableCopy 相當於alloc 一次,需要release
NSString *str2 = [str1 copy ];//淺拷貝
NSMutableString *str3 = [str1 mutableCopy];//深拷貝
NSLog(@"%p-%p-%p",str1,str2,str3);
[str2 release];
[str3 release];
[str1 release];
列印結果如下:
0x33323135-0x33323135-0x100531f60
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
NSMutableString *str1 = [[NSMutableString alloc]initWithFormat:@"123"];
//copy mutableCopy 相當於alloc 一次,需要release
NSString *str2 = [str1 copy ];//深拷貝
NSMutableString *str3 = [str1 mutableCopy];//深拷貝
NSLog(@"%p-%p-%p",str1,str2,str3);
[str2 release];
[str3 release];
[str1 release];
列印如下:0x100400270-0x33323135-0x1004131a0
copy | mutableCopy | |
NSString | NSString 淺拷貝 |
NSMutableString 深拷貝 |
NSMutableString | NSString 深拷貝 |
NSMutableString 深拷貝 |
NSArray | NSArray 淺拷貝 |
NSMutableArray 深拷貝 |
NSMutableArray | NSArray 深拷貝 |
NSMutableArray 深拷貝 |
NSDictionary | NSDictionary 淺拷貝 |
NSMutableDictionary 深拷貝 |
NSMutableDictionary | NSDictionary 深拷貝 |
NSMutableDictionary 深拷貝 |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@interface XZperson : NSObject
//使用copy修飾,生成不可變副本
@property(nonatomic,copy)NSMutableArray *dataArry;
@property(nonatomic,strong)NSArray *datas;
@end
#import "XZperson.h"
@implementation XZperson
@end
一. main.m 中來研究問題1所在.
XZperson *p = [[XZperson alloc]init];
p.dataArry = [NSMutableArray array];
[p.dataArry addObject:@"kk"];
//執行結果如下
[__NSArray0 addObject:]: unrecognized selector sent to instance 0x100409630
原因分析:使用copy 會讓dataArry生成不可變副本;
二 . main.m 中來研究問題2
XZperson *p = [[XZperson alloc]init];
p.datas = @[@"hehe",@"heihei"];
NSMutableArray *arrM = [NSMutableArray arrayWithObjects:@"jack",@"rose", nil];
p.datas = arrM;
[arrM addObject:@"lili"];
NSLog(@"%@-%@",[p.datas class],p.datas);
//列印結果如下
__NSArrayM - ( jack, rose, lili )
原陣列datas使用strong修飾,原來的陣列型別由不可變變成了可變,且當不可變datas 賦值可變陣列之後,對可變陣列的內容進行修改也會直接影響不可變datas的初始值。