ios 了解深拷贝和浅拷贝

2018-05-31  本文已影响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是深拷贝*
上一篇 下一篇

猜你喜欢

热点阅读