iOS基础 为什么要用Copy修饰字符串

前言:最近一直在准备面试题,发现有很多知识点是平时开发过程中知其然不知其所以然的状态,我也想在这里记录一下这些不求甚解的知识点,希望能帮到大家,也能帮我加深理解。
首先要知道什么是Copy,Copy就是浅拷贝,浅拷贝就是指针拷贝,即让目标指针与源指针指向同一片内存,但也并不是一定不会开辟新的内存,下面代码将论证我这一结论。我定义了一个由Copy修饰的NSString属性

@property (nonatomic,copy) NSString *testString;

在函数中我定义了一个可变字符串mutableStr,同时执行self.testString = mutableStr操作

    NSMutableString *mutableStr = [NSMutableString stringWithFormat:@"%@",@"dsfjdkf"];
    self.testString = mutableStr;
    NSLog(@"mutableStr address is %p testString address is %p",mutableStr,self.testString);

输出结果为mutableStr address is 0x608000049840 testString address is 0xa666b646a6673647
打印mutableStr和self.testString的地址发现两个地址并不相同,可以论证我上面提到的观点,对可变对象copy会开辟新的内存。这仅仅可以论证copy不一定只是指针拷贝,并不足以论证字符串为什么要用copy修饰,因为strong也可以修饰对象,那么为什么不用strong呢?接下来,我将testString的修饰符改为strong,打印结果为mutableStr address is 0x608000051550 testString address is 0x608000051550。可以看出,strong并不会开辟新的内存空间,如果mutableStr的值改变,那么self.testString的值也会被改变,这样就会存在安全性的问题。这就解释了为什么字符串一定要用copy修饰。
总结:使用copy修饰的对象是不可变的,也不存在被修改值的问题,所以也不会有安全性的问题。

你可能感兴趣的:(iOS基础 为什么要用Copy修饰字符串)