美文网首页85107915953c程序员
iOS 深拷贝和浅拷贝

iOS 深拷贝和浅拷贝

作者: 火柴盒环游记 | 来源:发表于2018-11-07 18:39 被阅读2次

    参考了一些文章,感觉写的都不够全面,于是决定自己进行实践并整理,用来作为对相关知识的总结。如有不合理之处,欢迎指正。

    1、非容器型对象(例如 字符串)

    1、属性变量(通过修饰符)

    创建model

    @interface Fish : NSObject
    @property (nonatomic,strong) NSString *strStrong;
    @property (nonatomic,copy) NSString *strCopy;
    
    @property (nonatomic,strong) NSMutableString *mutStrStrong;
    @property (nonatomic,copy) NSMutableString *mutStrCopy;
    @end
    
    //可变字符串进行赋值
      NSMutableString *mutString = [NSMutableString stringWithFormat:@"1234"];
    
        Fish *f = [[Fish alloc] init];
        f.strStrong = mutString;
        f.strCopy = mutString;
        
        f.mutStrStrong = mutString;
        f.mutStrCopy = mutString;
        
        [mutString appendFormat:@"456"];
        
        NSLog(@"内容:%@-%@-%@",f.strStrong,f.strCopy,mutString);
        NSLog(@"Mut 内容:%@-%@-%@",f.mutStrStrong,f.mutStrCopy,mutString);
        
        NSLog(@"指针:%p-%p-%p",f.strStrong,f.strCopy,mutString);
        NSLog(@"Mut 指针:%p-%p-%p",f.mutStrStrong,f.mutStrCopy,mutString);
    

    打印结果:

    内容:1234456-1234-1234456
    Mut 内容:1234456-1234-1234456
    
    指针:0x1c4444a40-0xa000000343332314-0x1c4444a40
    Mut 指针:0x1c4444a40-0xa000000343332314-0x1c4444a40
    
    //总结:
    //strong类型变量,不管是可变还是不可变,用可变字符串进行赋值,都是浅拷贝,指向同一个地址(指针拷贝),所以改变字符内容后,对应的内容也发生变化
    //copy类型变量,赋值属于深拷贝,指针地址发生变化(内容拷贝),所以改变字符串内容后,该变量不发生变化
    
    
    //由于 f.strCopy和 f.mutStrCopy指向同一个地址,
    //猜想改变一个变量值另一个也会发生变化,
    //于是进行以下操作:
    
    //执行[f.mutStrCopy appendFormat:@"456"]  由于f.mutStrCopy类型赋值后已经不可变,
    //所以出现Crash
    
    //f.mutStrCopy = @“456”直接赋值,则指针地址发生变化(同下不可变字符串赋值)
    //所以此两种情况都不会改变copy变量内容
    
    //不可变字符串赋值
        NSString *str = @"123";
        
        Fish *f = [[Fish alloc] init];
        
        f.strStrong = str;
        f.strCopy = str;
        
        f.mutStrStrong = str;
        f.mutStrCopy = str;
        
        str = @"345";
            
        NSLog(@"内容:%@-%@-%@",f.strStrong,f.strCopy,str);
        NSLog(@"Mut 内容:%@-%@-%@",f.mutStrStrong,f.mutStrCopy,str);
        
        NSLog(@"指针:%p-%p-%p",f.strStrong,f.strCopy,str);
        NSLog(@"Mut 指针:%p-%p-%p",f.mutStrStrong,f.mutStrCopy,str);
    

    打印结果

    内容:123-123-345
    Mut 内容:123-123-345
    指针:0x104dbc2a0-0x104dbc2a0-0x104dbc2c0
    Mut 指针:0x104dbc2a0-0x104dbc2a0-0x104dbc2c0
    
    //总结:
    //无论是否可变,不可变字符串赋值只是进行浅拷贝(指针拷贝),指向同一个地址
    //对源字符串进行重新赋值,则会指向新的指针地址,但是属性指针还是原来的地址,所以已经赋值的变量不会发生变化
    

    待更新...

    相关文章

      网友评论

        本文标题:iOS 深拷贝和浅拷贝

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