美文网首页
iOS开发 - copy与mutableCopy不搞清楚容易出b

iOS开发 - copy与mutableCopy不搞清楚容易出b

作者: 俺不是大佬儿 | 来源:发表于2021-12-29 16:03 被阅读0次

    一、copy浅拷贝

    copy (是NSCopying协议的方法)
    返回的对象是通过调用copyWithZone: (返回一个新的实例,这个实例是接收器的副本)这个方法返回的

    拷贝的是指针地址,拷贝出来的对象与源对象地址一致! 这意味着我修改拷贝对象的值会直接影响到源对象

    二、mutableCopy深拷贝

    mutableCopy(是NSMutableCopying协议的方法)
    通过mutableCopyWithZone:返回一个新的实例,这是一个可变的接收器的副本

    只有定义“不可变与可变”区别的类才应采用此协议(NSMutableCopying协议)即只有定义不可变与可变区别的类,才可以使用mutableCopy

    拷贝出来的对象与源对象地址不一致! 这意味着我修改拷贝对象的值对源对象的值没有任何影响

    copy就是浅拷贝, mutableCopy就是深拷贝这种认识是片面的
    事实上copy也可以是深拷贝。可变对象进行copy,会产生新的对象地址,而不是新的指针地址。,mutableCopy也未必全都是深复制

    细节来了

    对于NSArray、NSDictionary、NSSet容器类型的对象,深拷贝可分为:"不完全深拷贝"和"完全深拷贝"。
    不完全深拷贝:拷贝出来的容器是新的对象,但是容器里面的对象还是原来对象
    完全深拷贝:拷贝出来的容器是新的对象,容器里面的对象也是新对象

    三、对照表

    非容器类

    对象类型 不可变对象 可变对象
    copy 浅拷贝 深拷贝
    mutableCopy 深拷贝 深拷贝

    对照举例:

    NSString 类型:string
    string.copy:返回NSString类型的 (浅拷贝)
    string.mutableCopy:返回NSMutableString类型 (深拷贝)

    NSMutableString类型:muString
    muString.copy:返回NSMutableString类型的 ( 深拷贝)
    muString.mutableCopy:返回NSMutableString类型 (深拷贝)

    容器类

    对象类型 不可变对象 可变对象
    copy 浅拷贝 深拷贝
    mutableCopy 深拷贝 深拷贝

    对照举例:

    NSArray类型的数组:arr
    arr.copy:返回NSArray类型 (浅拷贝)
    arr.mutableCopy:返回NSMutableArray类型 (深拷贝)

    NSMutableArray类型的数组:muArr
    muArr.copy:返回NSArray类型 ( 深拷贝)
    muArr.mutableCopy:返回NSMutableArray类型 (深拷贝)


    \color{gray}{只是因为在这个问题上栽了一下,顺便总结记录下来}

    \color{gray}{欢迎大佬儿来指正纠错,共同学习😏!!}

    相关文章

      网友评论

          本文标题:iOS开发 - copy与mutableCopy不搞清楚容易出b

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