Copy(浅拷贝)、MutableCopy(深拷贝)

以下是本人自己的总结及验证。
总结:对于copy(浅拷贝):如果被拷贝的对象是可变的,则被赋予的对象会指向系统重新分配的与被拷贝的对象有相同内容的不同内存。如果被拷贝的对象是不可变的,则被赋予的对象与被拷贝的对象指向同一块内存。
eg:A=[B copy] : 如果B是可变对象,则A会指向系统重新分配的与B有相同内容的新内存。如果B是不可变对象,则A会指向与B指向相同的同一块内存。
对于MutableCopy(深拷贝):无论被拷贝的对象是可变对象还是不可变对象,被赋予的对象都会指向系统重新分配的与被拷贝的对象有相同内容的不同内存。
eg:A=[B MutableCopy]:无论B是可变对象还是不可变对象,A都会指向系统重新分配的与B有相同内容的不同内存。
以下是验证:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Life Cycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self notContainerClass];
    [self containerClass];

    //总结:对于浅拷贝(copy)如果被拷贝的对象是可变的则会指向系统重新分配的与被拷贝的对象有相同内容的不同内存,如果被拷贝的对象是不可变的则会指向同一块内存
         //对于深拷贝(mutableCopy)无论对象是可变的还是不可变的都会指向系统重新分配的与被拷贝的对象有相同内容的不同内存
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

#pragma mark - Private Method

/**
 *  非容器类   如:NSString NSNumber
 */

-(void)notContainerClass
{
    //对于不可变字符串对象的拷贝
    //浅拷贝(copy)会指向同一块内存
    //深拷贝(mutableCopy)则会指向另一块有相同内容的新内存(即系统会重新分配一块有相同内容的内存)

    NSString *str1=@"试问谁可,洁白无比";
    //content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
    NSLog(@"content=%@ add=%p class=%@",str1,str1,[str1 class]);

    NSString *str1Copy=[str1 copy];
    //content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
    NSLog(@"content=%@ add=%p class=%@",str1Copy,str1Copy,[str1Copy class]);
    NSMutableString *str1M=[str1 mutableCopy];
    //content=试问谁可,洁白无比 add=0x7f82404a0bf0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",str1M,str1M,[str1M class]);

    str1=@"海阔天空";
    // content=海阔天空 add=0x10dfbc0a8 class=__NSCFConstantString
    NSLog(@"content=%@ add=%p class=%@",str1,str1,[str1 class]);
    //content=试问谁可,洁白无比 add=0x10dfbc068 class=__NSCFConstantString
    NSLog(@"content=%@ add=%p class=%@",str1Copy,str1Copy,[str1Copy class]);
    //content=试问谁可,洁白无比 add=0x7f82404a0bf0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",str1M,str1M,[str1M class]);



    //对于可变字符串对象的拷贝  无论深拷贝还是浅拷贝系统都会重新分配一块有相同内容的新内容


    NSMutableString *test1=[NSMutableString stringWithFormat:@"试问谁可,洁白无比"];
    //content=试问谁可,洁白无比 add=0x7fe2307413e0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",test1,test1,[test1 class]);
    NSString *testCopy=[test1 copy];
    //content=试问谁可,洁白无比 add=0x7fe230741540 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",testCopy,testCopy,[testCopy class]);
    NSString *testM=[test1 mutableCopy];
    //content=试问谁可,洁白无比 add=0x7fe23073ef60 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",testM,testM,[testM class]);
    NSMutableString *mTestM=[test1 mutableCopy];
    //content=试问谁可,洁白无比 add=0x7fe230729eb0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",mTestM,mTestM,[mTestM class]);

    [test1 appendString:@"你好,阳光"];
    //content=试问谁可,洁白无比你好,阳光 add=0x7fe2307413e0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",test1,test1,[test1 class]);
    //content=试问谁可,洁白无比 add=0x7fe230741540 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",testCopy,testCopy,[testCopy class]);
    //content=试问谁可,洁白无比 add=0x7fe23073ef60 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",testM,testM,[testM class]);
    //content=试问谁可,洁白无比 add=0x7fe230729eb0 class=__NSCFString
    NSLog(@"content=%@ add=%p class=%@",mTestM,mTestM,[mTestM class]);

}

/**
 *  容器类 如:NSArray
 */

-(void)containerClass
{

    //对于不可变数组对象的拷贝
    //浅拷贝会指向同一块有相同内容的内存
    //深拷贝会指向有相同内容的不同内存


    NSArray *array1=@[@"color",@"sun"];
//    copy、mutableCopy[7316:65512] content=(
//    color,
//    sun
//    ) add=0x7f9439ea1900 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",array1,array1,[array1 class]);
    NSArray *arrayCopy=[array1 copy];
//    content=(
//             color,
//             sun
//             ) add=0x7f9439ea1900 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",arrayCopy,arrayCopy,[arrayCopy class]);
    NSMutableArray *arrayM=[array1 mutableCopy];
//    content=(
//             color,
//             sun
//             ) add=0x7f9439c02e40 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",arrayM,arrayM,[arrayM class]);

    array1=@[@"hello,world"];
//    content=(
//             "hello,world"
//             ) add=0x7f9439c03b60 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",array1,array1,[array1 class]);
//    content=(
//             color,
//             sun
//             ) add=0x7f9439ea1900 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",arrayCopy,arrayCopy,[arrayCopy class]);
//    content=(
//             color,
//             sun
//             ) add=0x7f9439c02e40 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",arrayM,arrayM,[arrayM class]);


    //对于可变数组对象的拷贝   无论copy、mutableCopy都会指向不同的有相同内容的内存(即系统会重新分配与被拷贝的对象有相同内容的内存)


    NSMutableArray *mArray1=[[NSMutableArray alloc] initWithObjects:@"color",@"sun", nil];
//    content=(
//             color,
//             sun
//             ) add=0x7fc3bb518a60 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",mArray1,mArray1,[mArray1 class]);
    NSArray        *mArray1Copy=[mArray1 copy];
//    content=(
//             color,
//             sun
//             ) add=0x7fc3bb785a50 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",mArray1Copy,mArray1Copy,[mArray1Copy class]);
    NSMutableArray *mArray1M=[mArray1 mutableCopy];
//    content=(
//             color,
//             sun
//             ) add=0x7fc3bb786df0 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",mArray1M,mArray1M,[mArray1M class]);

    [mArray1 addObject:@"hello,world"];
//    content=(
//             color,
//             sun,
//             "hello,world"
//             ) add=0x7fc3bb518a60 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",mArray1,mArray1,[mArray1 class]);
//    content=(
//             color,
//             sun
//             ) add=0x7fc3bb785a50 class=__NSArrayI
    NSLog(@"content=%@ add=%p class=%@",mArray1Copy,mArray1Copy,[mArray1Copy class]);
//    content=(
//             color,
//             sun
//             ) add=0x7fc3bb786df0 class=__NSArrayM
    NSLog(@"content=%@ add=%p class=%@",mArray1M,mArray1M,[mArray1M class]);

}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值