拷贝的目的:产生一个副本,跟原对象之间互不影响。即修改原对象(或者副本)不会影响副本(或原对象)。
深拷贝:生成一个新的对象,叫深拷贝
浅拷贝:复制一个新的指针指向同一个对象,叫浅拷贝
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的初始值。