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修饰的对象是不可变的,也不存在被修改值的问题,所以也不会有安全性的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,027评论 0 12
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,358评论 0 6
  • 史上最全的iOS面试题及答案 iOS面试小贴士———————————————回答好下面的足够了----------...
    Style_伟阅读 2,409评论 0 35
  • Oracle -- 成员监听触发器 添加该人数据前删该人的旧数据 drop trigger if exists ...
    F的平方阅读 338评论 0 0