美文网首页iOS 之路其他Object-C
[iOS]深拷贝/浅拷贝区别

[iOS]深拷贝/浅拷贝区别

作者: 程序猿_老李 | 来源:发表于2016-07-05 00:19 被阅读552次
来点鸡汤:

// 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则:
// 1. 改变原对象的属性和行为不会影响副本对象
// 2. 改变副本对象的属性和行为不会影响原对象


来段示例代码

<pre>

  • (void)viewDidLoad {
    [super viewDidLoad];
    /##########################################/
    // 以NSArray 为例
    /##########################################/

    // 1. 不可变对象调用copy方法
    NSArray *arr1 = [NSArray arrayWithObjects:@"1", nil];
    // 不会产生新对象
    NSArray *copyArr1 = [arr1 copy];

    NSLog(@"%p, %p\n", arr1, copyArr1);
    NSLog(@"%ld, %ld\n", [arr1 retainCount], [copyArr1 retainCount]); // 字符串引用计数-1
    /##########################################/
    // 打印结果
    0x7fbdd340dbf0, 0x7fbdd340dbf0
    2, 2
    // 这个为浅拷贝, 没有产生新对象, copyArr1还是指向arr1的地址

    1.不可变对象调用copy方法.png
    /##########################################/
    // 2. 不可变对象调用mutableCopy方法
    NSArray *arr2 = [NSArray arrayWithObjects:@"2", nil];
    // 会产生新的可变对象
    id mutableCopyArr2 = [arr2 mutableCopy];

    NSLog(@"%@, %p, %p\n", [mutableCopyArr2 class], arr2, mutableCopyArr2);
    NSLog(@"%ld, %ld", [arr2 retainCount], [mutableCopyArr2 retainCount]);
    /##########################################/
    // 打印结果
    __NSArrayM, 0x7fbdd3600250, 0x7fbdd36445ba
    1, 1
    // __NSArrayM类型是可变数组, 这个为深拷贝, 产生新的对象, 引用计数分别为1

    2.不可变对象调用mutableCopy方法.png
    /##########################################/
    // 3. 可变对象调用copy方法
    NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"3", nil];
    // 会产生不可变对象
    id copyArr3 = [arr3 copy];

    NSLog(@"%@, %p, %p\n", [copyArr3 class], arr3, copyArr3);
    NSLog(@"%ld, %ld", [arr3 retainCount], [copyArr3 retainCount]);
    /##########################################/
    // 打印结果
    __NSArrayI, 0x7fb120f12a40, 0x7fb120f10c70
    1, 1
    // NSArrayI代表不可变数组, 这个为深拷贝, 产生新对象(由可变对象变成不可变对象), 引用计数分别为1

    3.可变对象调用copy方法.png
    /##########################################/
    // 4. 可变对象调用mutableCopy方法
    NSMutableArray *arr4 = [NSMutableArray arrayWithObjects:@"4", nil];

    // 会产生可变对象
    id mutableCopyArr4 = [arr4 mutableCopy];

    NSLog(@"%@, %p, %p", [arr4 class], arr4, mutableCopyArr4);
    NSLog(@"%ld, %ld", [arr4 retainCount], [mutableCopyArr4 retainCount]);
    /##################################################/
    // 打印结果
    __NSArrayM, 0x7fc06062f930, 0x7fc06052f960
    1, 1
    // NSArrayM代表可变数组, 这个为深拷贝, 地址不同, 引用计数分别为1

    4.可变对象调用mutableCopy方法.png
    /##################################################/
    // 总结:
    /*
    只有在第一种情况才是浅复制
    运用copy的终极目的是: 当我赋值后,改变旧值不会影响新值. 如果要改变,就用retain
    浅拷贝: 好比是你的影子, 你完了, 影子也完了.
    深拷贝: 好比是你的克隆人, 你完了, 克隆人还在.

    */

}
</pre>

相关文章

  • iOS 深浅拷贝

    iOS深拷贝与浅拷贝的区别 深拷贝与浅拷贝的概念:(我的理解,望不吝赐教) 浅拷贝:只copy一份对象的指针,指向...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 深拷贝和浅拷贝

    干货!深拷贝和浅拷贝的区别 深拷贝才是拷贝,浅拷贝就是Retain Copy与Retain的区别 Copy: 根据...

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 深拷贝和浅拷贝

    1: iOS开发 深拷贝与浅拷贝 2: iOS 浅谈:深.浅拷贝与copy.strong 3: iOS开发——深...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解iOS ...

  • iOS 图文并茂的带你了解深拷贝与浅拷贝

    iOS 图文并茂的带你了解深拷贝与浅拷贝 iOS 图文并茂的带你了解深拷贝与浅拷贝

  • python的浅拷贝和深拷贝

    对于不可变类型,浅拷贝和深拷贝没有区别 对于不可变类型 赋值 浅拷贝 深拷贝

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

网友评论

本文标题:[iOS]深拷贝/浅拷贝区别

本文链接:https://www.haomeiwen.com/subject/wglhjttx.html