zoukankan      html  css  js  c++  java
  • copy 深拷贝和浅拷贝的区别

    第一步我们首先创建一个Person的类,Person.h

     1 #import <Foundation/Foundation.h>
     2 //要实现copy必须遵守NSCopying或者NSMutableCopying协议,这里面有一个必须实现的协议copyWithZone:
     3 @interface Person : NSObject<NSCopying>
     4 @property(retain,nonatomic)NSString *name;
     5 
     6 @property(copy,nonatomic)NSArray *array;
     7 @property(copy,nonatomic)NSMutableArray *mArray;
     8 
     9 
    10 
    11 
    12 @end

    Person.m

     1 #import "Person.h"
     2 
     3 @implementation Person
     4 -(id)copyWithZone:(NSZone *)zone
     5 {
     6     Person *pp=[[Person alloc]init];
     7     NSLog(@"pp=%p",pp);
     8     pp.name=self.name;
     9     return pp;
    10 }
    11 @end

    第二步,我们来看看 不可变copy和可变copy的区别吧

     1 #import <Foundation/Foundation.h>
     2 #import "Person.h"
     3 int main(int argc, const char * argv[]) {
     4     /*
     5      1、浅拷贝:就相当于retain,只copy了一个对象的引用,和本身是同一个对象,就相当于影子、
     6      2、深拷贝:从新开辟了一块内存空间,用来存放原来对象里面的东西,这个时候,copy出来的对象和原来的对象不是同一个对象,他们的内容一样,就相当于克隆人
     7      3、拷贝出来的的对象是什么类型取决于使用什么拷贝
     8     */
     9     
    10     
    11     //1、不可变copy拷贝不可变对象(浅拷贝)
    12     /*
    13     NSArray *array=[[NSArray alloc]initWithObjects:@"1",@"2", nil];
    14     NSArray *array1=[array copy];
    15     NSLog(@"array1=%@",array1);
    16     NSLog(@"array=%p,array1=%p",array,array1);
    17     NSLog(@"array = %lu ,array1 = %lu",[array retainCount],[array1 retainCount]);
    18 */
    19     //2、不可变copy拷贝可变对象(深拷贝)
    20     /*
    21     NSMutableArray *mArray=[[NSMutableArray alloc]initWithObjects:@"1",@"2", nil];
    22     // NSMutableArray *array=[[NSArray alloc]init];
    23     NSArray *array=[mArray copy];
    24     NSLog(@"mArray=%p,array=%p",mArray,array);
    25     NSLog(@"array=%@",array);
    26     NSLog(@"array的类型%@",[array class]);
    27     */
    28     //3、可变copy拷贝不可变对象(深拷贝)
    29     /*
    30     NSArray *array=[[NSArray alloc]initWithObjects:@"1",@"2", nil];
    31     NSMutableArray *mArray=[array mutableCopy];
    32     NSLog(@"-%@",[[array mutableCopy] class]);
    33     NSLog(@"array=%p,mArray=%p",array,mArray);
    34     NSLog(@"mArray=%@",mArray);
    35     */
    36     //4、可变copy拷贝可变对象(深拷贝)
    37     /*
    38     NSMutableArray *mArray=[[NSMutableArray alloc]initWithObjects:@"1",@"2", nil];
    39     NSMutableArray *array=[mArray mutableCopy];
    40     NSLog(@"%@",[[mArray mutableCopy] class]);
    41     NSLog(@"mArray=%p,array=%p",mArray,array);
    42     NSLog(@"array=%@",array);
    43     */
    44     
    45     //5、自定义类的copy
    46     /*
    47      要实现copy必须遵守NSCopying或者NSMutableCopying协议,这里面有一个必须实现的协议copyWithZone:
    48      */
    49 
    50     Person *p=[[Person alloc]init];
    51     p.name=@"张三";
    52     Person *p1=[p copy];
    53     NSLog(@"p=%p,p1=%p",p,p1);
    54     NSLog(@"p1的名字为%@",p1.name);
    55     
    56     
    57     
    58     //6、属性的copy
    59     /*
    60     1、copy修饰不可变属性的时候,就相当于retain
    61     2、copy修饰可变属性的时候,相当于不可变copy拷贝可变对象。属于深拷贝,这个时候,属性和对属性赋值的对象的内存都需要单独管理
    62     3、建议对象类型都是用retain
    63      */
    64     
    65     
    66     
    67     
    68     NSArray *bookArray=[[NSArray alloc]initWithObjects:@"三字经",@"水浒传",@"西游记", nil];
    69     p.array=bookArray;
    70     NSLog(@"p.array=%p,bookArray=%p",p.array,bookArray);
    71     [p.array release];
    72     [p.array release];
    73     
    74     
    75     
    76     
    77     NSMutableArray *moneyArray=[[NSMutableArray alloc]initWithObjects:@"1w",@"5W",@"20w" ,nil];
    78     p.mArray=moneyArray;
    79     
    80     NSLog(@"p.mArray=%p,moneyArray=%p",p.mArray,moneyArray);
    81     [p.mArray release];
    82     [moneyArray release];
    83     
    84     
    85     
    86     
    87     
    88     
    89     
    90     return 0;
    91 }

     最后个人总结:

    copy
    1.不可变copy拷贝不可变对象(浅拷贝)
    2.不可变copy拷贝可变对象 (深拷贝)
    不可变copy拷贝拷贝出来的对象是不可变的

    3.可变copy拷贝不可变对象(深拷贝)
    4.可变copy拷贝可变对象 (深拷贝)
    可变copy拷贝拷贝出来的对象是可变的

  • 相关阅读:
    webSocket
    Spring中注解大全和应用
    原生js替换jQuery各种方法-中文版
    正则表达式-基础知识Review
    Swoole 4.1.0 正式版发布,支持原生 Redis/PDO/MySQLi 协程化
    Javascript 模块化指北
    精读《sqorn 源码》
    nodejs源码—初始化
    ubuntu显卡驱动安装
    iOS推断当前控制器是否在显示
  • 原文地址:https://www.cnblogs.com/yyxblogs/p/4835518.html
Copyright © 2011-2022 走看看