zoukankan      html  css  js  c++  java
  • 内存管理-深浅拷贝之 copy和mutableCopy

      本文主要研究对不可变对象和可变对象分别进行copy,mutableCopy,对产生的结果,进行探讨内存地址以及是否可变。

      好吧,说的拗口了,先贴结论

      

    上代码:

    一、对不可变对象拷贝

    NSString * str1=[NSString stringWithFormat:@"str1"];
    
    //    1、定义一个不可变数组
        NSArray *arrImult=[NSArray arrayWithObject:str1];
    
    //    2、对不可变数组进行copy和mutableCopy
        NSMutableArray *arrCopy=[arrImult copy];
        NSMutableArray *arrMultCopy=[arrImult mutableCopy];
        
    //    3、打印地址
        NSLog(@"%p",str1);
        NSLog(@"%p",arrImult);
        NSLog(@"arrCopy--->%p",arrCopy);
        NSLog(@"arrMultCopy--->%p",arrMultCopy);
        
    //    4、尝试改变
      
        [arrMultCopy  addObject:@"arrMultCopy"];
        NSLog(@"%@",arrMultCopy);
        
        [arrCopy addObject:@"arrCopy"];//程序崩溃,报错
         NSLog(@"%@",arrCopy);
    

     打印信息:

    2015-10-29 11:53:24.130 test123[1182:152126] 0x7fbfe8d60790

    2015-10-29 11:53:24.130 test123[1182:152126] 0x7fbfe8d60550

    2015-10-29 11:53:24.131 test123[1182:152126] arrCopy--->0x7fbfe8d60550

    2015-10-29 11:53:24.131 test123[1182:152126] arrMultCopy--->0x7fbfe8d28bc0

    2015-10-29 11:53:24.131 test123[1182:152126] (

        str1,

        arrMultCopy

    )

    最后一个打印报错的信息。。。。

        结论:

        1、对不可变的对象做  copy,得到的是不可变对象的地址,浅拷贝,拷贝指针,所以,没有产生新对象,依旧不可变;

        2、对不可变的对象做  mutableCopy ,产生新的对象,该对象是可变的。

    二、对可变对象进行拷贝

        NSString * str1=[NSString stringWithFormat:@"str1"];
    //    1、定义一个可变数组
        NSMutableArray * arrMult=[NSMutableArray arrayWithObject:str1];
    //    2、对可变数组进行 copy 和mutableCopy
        NSMutableArray * arrCopy=[arrMult copy];
        NSMutableArray * arrMultCopy=[arrMult mutableCopy];
        
    //    3、打印地址
        NSLog(@"arrMult-->%p",arrMult);
        NSLog(@"arrCopy-->%p",arrCopy);
        NSLog(@"arrMultCopy-->%p",arrMultCopy);
    //    4、尝试改变
        [arrMultCopy addObject:@"arrMultCopy"];
        NSLog(@"%@",arrMultCopy);
        
        [arrCopy addObject:@"arrCopy"];//程序崩溃,报错
        NSLog(@"%@",arrCopy);
        
    

     打印结果:

    2015-10-29 11:39:27.608 test123[1091:145654] arrMult-->0x7fbbe25a0ae0

    2015-10-29 11:39:27.609 test123[1091:145654] arrCopy-->0x7fbbe25a01e0

    2015-10-29 11:39:27.609 test123[1091:145654] arrMultCopy-->0x7fbbe25a0500

    2015-10-29 11:39:27.609 test123[1091:145654] (

        str1,

        arrMultCopy

    )

    最后一个打印的报错信息。。。

    结论:

        3、对可变对象做  copy,得到的是新地址,也就是说,产生了新对象,但是,新对象是不可变的;

        4、对可变对象做  mutableCopy,长生新的对象,该对象是可变的。

      

  • 相关阅读:
    和Java相关的书籍,想成为架构师的请收藏一下啊
    CF1404C Fixed Point Removal 题解
    Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) E~G 题解
    ABC223G Vertex Deletion 题解
    ARC103D Distance Sums 题解
    ARC103B Robot Arms 题解
    ABC221G Jumping sequence 题解
    ABC221F Diameter set 题解
    ABC211H Count Multiset 题解
    CF1342E Placing Rooks 题解
  • 原文地址:https://www.cnblogs.com/panyuluoye/p/4920012.html
Copyright © 2011-2022 走看看