MRC Copy 与MutableCopy的区别

本文深入探讨了深拷贝与浅拷贝的概念,通过Objective-C中的NSString、NSArray和NSDictionary等实例,详细解释了两种拷贝方式的区别及其在不同场景下的应用。并分析了属性修饰符copy和strong对对象的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拷贝的目的:产生一个副本,跟原对象之间互不影响。即修改原对象(或者副本)不会影响副本(或原对象)。

深拷贝:生成一个新的对象,叫深拷贝

浅拷贝:复制一个新的指针指向同一个对象,叫浅拷贝

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值