iOS中的copy和mutalbeCopy详解

copy浅拷贝

NSString *str = @"ceshi";
NSString *str_copy = [str copy];

对于不可变对象 copy是浅拷贝

copy深拷贝

NSMutableString *str = [[NSMutableString alloc]initWithString:@"ceshi"];
NSString *str_copy = [str copy];

对于可变对象 copy是深拷贝

mutableCopy 深拷贝

  • 非容器类
NSString *str = @"1";
NSString *str_mutableCopy = [str MutableCopy];
此时指针地址不同 值相同 各自修改不受影响 对于非容器对象 mutableCopy都是深拷贝
  • 容器类
NSArray *arr = @[@"1"];
NSMutableArray *arr_mutableCopy = [arr mutableCopy];
arr 与 arr_mutableCopy 地址不同  但是两个容器里面的元素地址相同 修改其中一个元素 会影响另一个 可称为不完全深拷贝

NSString、NSMutableString 属性使用copy修饰的原因

定义两个属性【NSString或者NSMutableString均可】
@property (nonatomic,strong) NSMutableString *str_strong;
@property (nonatomic,copy) NSMutableString *str_copy;
赋值:
    NSMutableString *ms = [[NSMutableString alloc] initWithString:@"123"];
    self.str_strong = ms;
    self.str_copy = ms;
    [ms appendString:@"456"];
输出:
    self.str_strong=123456
    self.str_copy=123
ms 是可变对象  使用copy修饰self.str_copy  self.str_copy=ms系统会进行深拷贝self.str_copy指向的是一个拥有全新内存地址的对象 而self.str_strong和ms拥有相同的指针地址 所以ms改变self.str_strong会跟着改变 而self.str_copy不会改变

另一种情况:
    NSString *ms = @"123";
    self.str_strong = ms;
    self.str_copy = ms;
    此时三者地址相同
    ms = @"123456";
    self.str_strong与self.str_copy均为“123” 因为ms = @"123456";执行后ms地址改变了。但是self.str_strong与self.str_copy仍然为之前的地址。

你可能感兴趣的:(iOS中的copy和mutalbeCopy详解)