美文网首页
ios 了解深拷贝和浅拷贝

ios 了解深拷贝和浅拷贝

作者: 我的梦工厂 | 来源:发表于2018-05-31 16:28 被阅读0次

    iOS 了解深拷贝和浅拷贝

    一、概念与总结

    1、浅拷贝

    浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。

    浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对 象。

    2、深拷贝

    深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

    二、示例分析

    oc 在iOS中深拷贝与浅拷贝要更加的复杂,涉及到容器与非容器、可变与不可变对象的copy与mutableCopy。下面用示例逐一分析:

    1、非集合对象的copy与mutableCopy
    1.1 不可变对象NSString

    -(void) noMutableNSStringTest
    {
        NSString *str1 = @"test001";
        NSMutableString *str2 = [str1 copy];
        //copy返回的是不可变对象,str2不能被修改,因此会发生崩溃
        //[str2 appendString:@"test"];
        NSMutableString *str3 = [str1 mutableCopy];
        [str3 appendString:@"modify"];
       Log(@"str1:%p - %@ \r\n",str1,str1);
        NSLog(@"str2:%p - %@ \r\n",str2,str2);
        NSLog(@"str3:%p - %@ \r\n",str3,str3);
    }
    
    打印结果:
    2017-07-18:02:10.642beck.wang[1306:169414]str1:0x106abdbd0 - test001 
    2017-07-20 18:02:10.643 beck.wang[1306:169414] str2:0x106abdbd0 - test001
    2017-07-20 18:02:10.643 beck.wang[1306:169414] str3:0x608000260940 - test001modify
    
    分析:'str1、str2地址相同并且与str3地址不同,NSString的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝.'
    

    1.2 可变对象NSMutableString

    实例代码

      -(void) noMutableNSStringTest
       {
            NSString *str1 = @"test001";
           NSMutableString *str2 = [str1 copy];
         //copy返回的是不可变对象,str2不能被修改,因此会发生崩溃
          //[str2 appendString:@"test"];
           NSMutableString *str3 = [str1 mutableCopy];
           [str3 appendString:@"modify"];
           NSLog(@"str1:%p - %@ \r\n",str1,str1);
           NSLog(@"str2:%p - %@ \r\n",str2,str2);
           NSLog(@"str3:%p - %@ \r\n",str3,str3)
    }
    
    打印结果:
    2017-07-20 18:02:10.642beck.wang[1306:169414]str1:0x106abdbd0 - test001 
    2017-07-20 18:02:10.643 beck.wang[1306:169414] str2:0x106abdbd0 - test001 
    2017-07-20 18:02:10.643 beck.wang[1306:169414] str3:0x608000260940 - test001modify 
    
        >  分析:*str1、str2地址相同并且与str3地址不同,NSString的copy是浅拷贝,且copy返回的对象是不可变对象;mutableCopy是深拷贝*
    

    相关文章

      网友评论

          本文标题:ios 了解深拷贝和浅拷贝

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