iOS Copy 关键字

如何使用copy关键字
在定义NSString,NSArray等不可变类型,经常使用了copy关键字,这是因为他们存在可变类型 NSMutableString,NSMutableArray 等。
copy 方法返回的都是不可变的对象,利用copy关键字可以使本对象的属性不受外界影响,不论传入的是可变对象还是不可变对象,本身持有的就是copy复制的不可变副本。

这里还涉及到了深拷贝与浅拷贝的问题

浅拷贝:对内存地址的复制,让目标对象指针和原对象指向同一片内存空间会增加引用计数
深拷贝:对对象内容的复制,开辟新的内存空间

strong 与 copy 的区别

  • 传递不可变类型
    [super viewDidLoad];
    NSString *str = @"string";
    self.strStrong = str;
    self.strCopy = str;
    
    NSLog(@"内容: %@ - %@ - %@",str,_strStrong,_strCopy);
    NSLog(@"地址: %p - %p - %p",str,_strStrong,_strCopy);
内容: string - string - string
地址: 0x10395f020 - 0x10395f020 - 0x10395f020

这时候都是浅拷贝、只拷贝了指针

  • 传递可变类型
    NSString *strM = [[NSMutableString alloc] initWithString:@"string"];
    self.strStrong = strM;
    self.strCopy = strM;
    
    NSLog(@"内容: %@ - %@ - %@",strM,_strStrong,_strCopy);
    NSLog(@"地址: %p - %p - %p",strM,_strStrong,_strCopy);

内容: string - string - string
2022-05-19 13:35:09.273171+0800 Copy 测试[81534:828764] 地址: 0x6000021f0ae0 - 0x6000021f0ae0 - 0x9cbe336dbcbacf7f

这时候 copy 的就是深拷贝了,如果赋值之后对 strM 进行修改,那么 strStrong 会被修改,strCopy 不会被修改
set 方法里会执行 copy 操作、如果使用 _copy 赋值 是不行的

  • 可变类型使用 copy
    如果 strCopy 为 NSMutableString,那么使用 copy 的话,会的到 NSString,如果调用 NSMutableString 相关方法,则会崩溃,所以不可以用 copy 修饰可变类型

copy与mutableCopy

不论源对象是否可变:
copy 复制出的对象都是不可变的对象
mutableCopy 复制出的对象都是可变对象
基本类型不允许 copy

对于集合对象,要想实现深拷贝,需要自己手动地对内部元素一一拷贝。copy 不会帮拷贝集合内部元素

你可能感兴趣的:(iOS Copy 关键字)