zoukankan      html  css  js  c++  java
  • OC中的浅拷贝、单层浅拷贝、深拷贝

    1 对于非集合类对象的copy和mutableCopy (以NSString和NSMutableString为例子)

    (1) NSString:

    NSString *string = @"xiaotaiyang";
    NSString *stringCopy = [string copy];
    NSMutableString *stringMCopy = [string mutableCopy];

    NSLog(@"string: %p, %p", string, &string);
    NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
    NSLog(@"stringMCopy: %p, %p", stringMCopy, &stringMCopy);
    运行的结果如下:

    string: 0x1022fe078, 0x7fff5d901a48

    stringCopy: 0x1022fe078, 0x7fff5d901a40

    stringMCopy: 0x608000260240, 0x7fff5d901a38

    从上面可以看出对NSString进行copy,字符串对象的内存地址没有发生变化,仅仅是产生了一个新的指针指向字符串对象,但是进行 mutableCopy 操作,其字符串对象的内存地址已经发生了变化,并且产生了一个新的指针指向字符串对象

    (2) NSMutableString

    NSMutableString *string = [NSMutableString stringWithFormat:@"abc"];
    NSString *stringCopy = [string copy];
    NSMutableString *stringMCopy = [string mutableCopy];

    NSLog(@"string: %p, %p", string, &string);
    NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
    NSLog(@"stringMCopy: %p, %p", stringMCopy, &stringMCopy);

    运行的结果如下:

    string: 0x608000264680, 0x7fff5526aa48

    stringCopy: 0xa000000006362613, 0x7fff5526aa40

    stringMCopy: 0x608000264940, 0x7fff5526aa38

    对 NSMutableString 进行 copy 操作,其内存地址和指针地址都发生了变化,所以操作是深拷贝,和上面有所不同;进行 mutableCopy 操作,其内存地址和指针地址也都发生了变化,所以也是深拷贝。

    2 集合类对象的copy和mutableCopy(NSArray和NSMutableArray为例子)

    (1) NSArray

    NSString *element_01 = @"abc";
    NSString *element_02 = @"def";
    NSString *element_03 = @"ghi";
    NSArray *array = @[element_01, element_02, element_03];
    NSArray *arrayCopy = [array copy];
    NSMutableArray *arrayMCopy = [array mutableCopy];

    NSLog(@"array: %p, %p; array.firstObject: %p", array, &array, array.firstObject);
    NSLog(@"arrayCopy: %p, %p; arrayCopy.firstObject: %p", arrayCopy, &arrayCopy, arrayCopy.firstObject);
    NSLog(@"arrayMCopy: %p, %p; arrayMCopy.firstObject: %p", arrayMCopy, &arrayMCopy, arrayMCopy.firstObject);
    运行结果如下:

    array: 0x600000245910, 0x7fff51367a10; array.firstObject: 0x10e898088
    arrayCopy: 0x600000245910, 0x7fff51367a08; arrayCopy.firstObject: 0x10e898088
    arrayMCopy: 0x600000245670, 0x7fff51367a00; arrayMCopy.firstObject: 0x10e898088

    对 NSArray 进行 copy 操作的时候,数组的内存地址没有发生变化,仅仅是产生了一个新的指针指向数组对象,mutableCopy 操作时,其内存地址发生了变化,但是数组元素的内存地址并没有发生变化

    (2) NSMutableArray

    NSString *element_01 = @"abc";
    NSString *element_02 = @"def";
    NSString *element_03 = @"ghi";
    NSMutableArray *array = [NSMutableArray arrayWithArray:@[element_01, element_02, element_03]];

    NSArray *arrayCopy = [array copy];
    NSMutableArray *arrayMCopy = [array mutableCopy];

    NSLog(@"array: %p, %p; array.firstObject: %p", array, &array, array.firstObject);
    NSLog(@"arrayCopy: %p, %p; arrayCopy.firstObject: %p", arrayCopy, &arrayCopy, arrayCopy.firstObject);
    NSLog(@"arrayMCopy: %p, %p; arrayMCopy.firstObject: %p", arrayMCopy, &arrayMCopy, arrayMCopy.firstObject);
    运行结果如下:

    array: 0x6000000460c0, 0x7fff516d3a10; array.firstObject: 0x10e52c088
    arrayCopy: 0x600000046420, 0x7fff516d3a08; arrayCopy.firstObject: 0x10e52c088
    arrayMCopy: 0x600000046000, 0x7fff516d3a00; arrayMCopy.firstObject: 0x10e52c088

    对 NSMutableArray 进行 copy 和 mutableCopy 操作,其内存地址都发生了变化,但是,对于数组中的元素,不管是进行的哪种操作,内存地址始终都没有发生变化,所以属于单层深拷贝

    总结:如果对象想要实现深拷贝,必须实现NSMutableCopying,NSCopying协议或者直接调用

    [[NSMutableArray alloc] initWithArray:arr copyItems:YES];方法

     

  • 相关阅读:
    Python基础篇【第二篇】:运算符
    python详细安装pip教程
    工作区和暂存区
    linux日常命令记录
    git-版本回退
    git-版本状态
    git-创建版本库
    Python核心编程读笔 8: 文件和输入输出
    Python核心编程读笔 7: 条件和循环
    Python核心编程读笔 6: 映射和集合类型
  • 原文地址:https://www.cnblogs.com/jinlongyu123/p/10119303.html
Copyright © 2011-2022 走看看