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的初始值。

猜你喜欢

转载自blog.csdn.net/qq_33726122/article/details/84859736