美文网首页
深拷贝和浅拷贝之非容器类对象

深拷贝和浅拷贝之非容器类对象

作者: 哲逗年 | 来源:发表于2017-06-21 10:36 被阅读0次

    1.对可变对象进行copy操作

    NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
    NSString *copyStr = [mutaleStr copy];
    NSLog(@"mutaleStr:%p \n copyStr:%p",mutaleStr, copyStr);
    

    结果:

    mutaleStr:0x600000065400 
    copyStr  :0x640420201410595
    

    结论:对可变对象进行copy操作是内容copy(深copy)
    猜想:如果将
    NSString *copyStr = [mutaleStr copy];改为
    NSMutableString *copyStr = [mutaleStr copy];后,进行
    [copyStr appendString:@"sss"];
    会发生什么?
    结论:copyStr在编译时为NSMutableString,但是在运行时为NSString类型,所以对copyStr进行append等修改时,编译可通过,但运行时会崩溃。

    2.对可变对象进行mutableCopy操作

    NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
    NSMutableString *copyStr = [mutaleStr mutableCopy];
    NSLog(@"mutaleStr:%p \ncopyStr:%p",mutaleStr, copyStr);
    

    结果:

    mutaleStr:0x600000063180 
    copyStr  :0x6000000631c0
    

    结论:对可变对象进行mutableCopy操作是是内容copy(深copy)
    猜想:如果将
    NSMutableString *copyStr = [mutaleStr mutableCopy];改为
    NSString *copyStr = [mutaleStr mutableCopy];后,进行
    [copyStr appendString:@"sss"];
    会发生什么?
    结论:copyStr在编译时为NSString,在运行时为NSMutableString,所以对copyStr进行append等修改时,编译时就会报错。

    3.对不可变对象进行copy操作

    NSString *str = [NSString stringWithFormat:@"mutaleStr"];
    NSString *copyStr = [str copy];
    NSLog(@"str:%p \ncopyStr:%p",str, copyStr);
    

    结果

    str    :0x640420201410595 
    copyStr:0x640420201410595
    

    结论:对不可变对象进行copy操作是指针拷贝(浅拷贝)

    4.对不可变对象进行mutableCopy操作

    NSString *str = [NSString stringWithFormat:@"mutaleStr"];
    NSMutableString *mutableCopyStr = [str mutableCopy];
    NSLog(@"str:%p \nmutableCopyStr:%p",str, mutableCopyStr);
    

    结果:

    str           :0x640420201410595 
    mutableCopyStr:0x600000063180
    

    结论:对不可变对象 进行mutableCopy操作是内容拷贝(深拷贝)
    综上所述:只有对不可变对象进行copy操作是指针拷贝(浅拷贝),其他的都是内容拷贝(深拷贝)

    看文字看的想睡觉,放张我喜欢的智妍刺激刺激昏昏欲睡的大脑

    美不美
    下面放几个实例:
    @property (nonatomic, copy) NSString *name;

    NSMutableString类型的变量对name赋值:

    NSMutableString *mutaleStr = [NSMutableString stringWithString:@"mutaleStr"];
    //赋值
    self.name = mutaleStr;
    NSLog(@"\nmutaleStr:%p\nname:%p",mutaleStr,self.name);
    NSLog(@"\nmutaleStr:%@\nname:%@",mutaleStr,self.name);
    // 操作1
    [mutaleStr appendString:@"appendString"];
    // 操作2
    // mutaleStr = [NSMutableString stringWithString:@"resetValue"];
    NSLog(@"\n改变后........");
    NSLog(@"\nmutaleStr:%p\nname:%p",mutaleStr,self.name);
    NSLog(@"\nmutaleStr:%@\nname:%@",mutaleStr,self.name);
    /*
    当name声明为copy时,为(内容copy)深copy
    操作1和操作2都不会对self.name产生影响,因为是深copy
    
    当name声明为strong,为(指针copy)浅copy
    赋值:指向同一个地址,如果想产生copy的效果,可以这么赋值self.name = [mutaleStr copy];
    操作1:对mutaleStr进行appendString,地址没变,内容改变了
    结果:slef.name会随着mutaleStr改变而改变
    操作2:对mutaleStr重新赋值,mutaleStr的地址和内容都改变了
    结果:self.name不会变
     */
    

    对NSString类型的变量对name进行赋值:

    NSString *str = [NSString stringWithFormat:@"NSString"];
    self.name = str;
    NSLog(@"\nstr:%p\nname:%p",str,self.name);
    NSLog(@"\nstr:%@\nname:%@",str,self.name);
    /*
     不论name声明为strong还是copy都是浅拷贝
     */
    

    结论:这就是为什么很多大牛推荐用copy的原因,因为你不知道在声明Strong的情况下,会出现了莫名其妙的bug,所以说论写代码习惯的重要性。

    @property (nonatomic, copy) NSMutableString *name;

    NSMutableString类型的变量对name赋值:
    结论同上,如果name声明为strong的时候,如果对self.name进行append操作,也会反向同样影响mutaleStr的值

    NSString类型的变量对name进行赋值:
    如果name是strong类型,则是深copy;
    如果name是copy类型,则是浅copy,但是之前说了,如果copy过来了,在编译时是没有问题的,但是会在运行时报错.

    相关文章

      网友评论

          本文标题:深拷贝和浅拷贝之非容器类对象

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