美文网首页
浅拷贝和深拷贝

浅拷贝和深拷贝

作者: i爱吃土豆的猫 | 来源:发表于2021-04-13 23:22 被阅读0次

    copy的特点:

    修改源对象的属性和行为,不会影响副本对象
    修改副本对象的属性和行为,不会影响源对象

    浅拷贝只拷贝了地址, 深拷贝拷贝了地址和内容
    浅拷贝好比你的影子,你死了,影子也没了;
    深拷贝好比克隆人,你死了,它还在。

    NSString *str1 = @"非容器不可变对象";  
    NSString *str2 = [str1 copy];            得到的 NSMutableString  没有开辟内存空间, 只是复制了地址   
    NSString *str3 = [str1 mutableCopy];    得到的  NSString
    
    NSMutableString *str1 = [NSMutableString stringWithFormat:@"非容器可变对象"];
    NSMutableString *str2 = [str1 copy];            NSString
    NSMutableString *str3 = [str1 mutableCopy];      NSString
    

    用copy修饰的 或者赋值的 变量肯定是不可变的。
    用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
    对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
    对象之间赋值之后,再改变,遵循互不影响的原则

    1)、当源对象是不可变类型的时候,使用copy操作,得到的还是不可变类型副本,并且副本内存地址(指针)和源对象的内存地址是一样的,可以认为源对象和副本对象是同一对象,并没有产生新对象,相当于是执行了一次retain操作,这样的copy操作,叫做浅拷贝,也有人叫指针拷贝;

    2)、当源对象是可变类型的时候,使用copy操作得到的是不可变类型副本。类型不一样,内存地址也肯定不一样,即在内存中分配了新的地址空间,产生了新的对象。虽然内存地址不一样,但两者的内容是一样的,这样的copy操作,叫做深拷贝,也有人这叫做内容拷贝;

    3)、当源对象是不可变类型,使用mutableCopy操作,得到的副本对象是可变类型。一个可变,一个不可变,类型不一样,内存地址也不一样,产生了新的对象,所以也是深拷贝;

    4)、当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型。这个时候源对象和副本对象的内存地址是否一样?是否产生了新的对象?上面提到过,使用复制的目的是,改变源对象,副本对象的内容不跟着改变,根据这个原则,两个可变类型对象,要想一个改变不影响另外一个,只能是两个不同的对象,指向不同的内存地址。所以,当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型,这个副本是新的对象,也是深拷贝;

    NSString *str2 = [str1 copy]; NSString 浅拷贝
    NSMutableString *str2 = [str1 copy]; NSString 深拷贝

    NSString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝
    NSMutableString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝

    copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
    mutableCopy:始终是深拷贝

    相关文章

      网友评论

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

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