美文网首页
浅谈浅拷贝和深拷贝和字符串属性copy修饰的原因

浅谈浅拷贝和深拷贝和字符串属性copy修饰的原因

作者: Qing学 | 来源:发表于2018-01-30 14:45 被阅读0次

一、深拷贝和浅拷贝
在对象进行copy操作的时候。如果只复制了对象的指针,那么拷贝就属于浅拷贝。如果对对象的内容进行了拷贝。那么拷贝过程就属于深拷贝了。下面分别对NSString、NSArray、NSDictionary什么时候进行浅拷贝什么时候进行深拷贝进行分析。
1.NSString:

    NSString *baseStr = @"默认的字符串";
    NSString *copyStr = [baseStr copy];
    NSString *mutableCopyStr = [baseStr mutableCopy];
    NSLog(@"%p---%p---%p",baseStr,copyStr,mutableCopyStr);

控制台输出信息为


image.png

2.NSMutableString:

NSMutableString *mutableStr = [NSMutableString stringWithString:@"默认的字符串"];
    NSString *baseStr = [mutableStr copy];
    NSMutableString *mutableBaseStr = [mutableStr mutableCopy];
    NSLog(@"%p---%p---%p",mutableStr,baseStr,mutableBaseStr);

控制台输出信息为


image.png

NSString结论:
通过分析可得对NSString进行copy操作进行的是浅拷贝、mutableCopy操作进行的是深拷贝。
对于NSMutableString进行的copy和mutableCopy都是深拷贝。
3.NSArray

    NSArray *array = @[@"baseStr",@"baseStr2",@"baseStr3"];
    NSArray *copyArray = [array copy];
    NSArray *mutableCopy = [array mutableCopy];
    NSLog(@"%p---%p---%p",array,copyArray,mutableCopy);

控制台输出为


image.png

最终确认NSArray和NSDictionary进行copy
4.NSMutableArray

    NSMutableArray *mutableArray = [[NSMutableArray alloc]initWithArray:@[@"aaa",@"bbb",@"ccc"]];
    NSArray *copyArray = [mutableArray copy];
    NSArray *mutableCopy = [mutableArray mutableCopy];
    NSLog(@"%p---%p---%p",mutableArray,copyArray,mutableCopy);

控制台输出为


image.png

结论:经验证NSString、NSArray、NSDictionary进行copy都是浅拷贝(指针拷贝)、mutableCopy是深拷贝(内存拷贝)
二:@property使用copy和strong的区别
property使用copy和strong的区别
我们以字符串的处理为例进行讲解
NSString的情况下进行判断
(1)使用copy的情况

@interface ViewController ()

@property (nonatomic, copy) NSString *defaultCopyString;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
    self.defaultCopyString = mutableString;
    [mutableString appendString:@"123"];
    NSLog(@"%@",self.defaultCopyString);
}

控制台输出为
2018-01-30 14:39:28.283170+0800 PropertyCopyStrong[4378:559212] baseString
分析可得通过copy修饰的defaultCopyString字符串在进行赋值的时候,是将可变字符串进行了copy操作。对进行了内存的深拷贝。重新占用了一块内存地址。所以当对可变字符串进行处理的时候。可以发现defaultCopyString并没有发生改变。
(2)使用strong修饰的情况

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSString *defaultCopyString;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableString *mutableString = [NSMutableString stringWithString:@"baseString"];
    self.defaultCopyString = mutableString;
    [mutableString appendString:@"123"];
    NSLog(@"%@",self.defaultCopyString);
}

控制台输出为:
2018-01-30 14:42:27.591001+0800 PropertyCopyStrong[4400:560825] baseString123
通过分析可得当修饰符为strong的时候。并没有进行拷贝操作。只是将可变字符串mutableString的引用计数进行+1.内存地址并没有发生改变。当对可变字符串进行处理的时候defaultCopyString也同步发生了变化。
经验证NSArray和NSDictionary具有跟NSString相同的特性。如果涉及到可变数组和可变字典之间的相互转换并且涉及到数组和字典的变化时。最好使用copy来修饰。

相关文章

  • iOS开发之深拷贝与钱拷贝

    深拷贝和浅拷贝 以及各个修饰词的区别 1.Copy和Strong(1)修饰不可变的字符串示例代码:@propert...

  • 浅谈浅拷贝和深拷贝和字符串属性copy修饰的原因

    一、深拷贝和浅拷贝在对象进行copy操作的时候。如果只复制了对象的指针,那么拷贝就属于浅拷贝。如果对对象的内容进行...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • 浅拷贝与深拷贝

    /*浅拷贝:拷贝地址*/ /*深拷贝:拷贝对象*/ 用Strong修饰不可变数组:浅拷贝 用Copy修饰不可变数组...

  • iOS开发 图文并茂理解深拷贝与浅拷贝

    深拷贝和浅拷贝(Shallow copy 和 Deep copy) 一.概念定义 对象复制有两种:浅拷贝和深拷贝。...

  • 深拷贝和浅拷贝

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

  • 深拷贝和浅拷贝

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

  • -119| python篇 |浅谈拷贝 copy()

    说到copy(), 很自然就要谈到深拷贝 deepcopy() 和 浅拷贝 copy() 深拷贝:拷贝值 和 重新...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

网友评论

      本文标题:浅谈浅拷贝和深拷贝和字符串属性copy修饰的原因

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