为什么NSString要用Copy来修饰?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52314205

关于NSString要用Copy来修饰这个问题,我不多说只是摆出代码:

// 深复制

Person * xiaoMing = [[Personalloc]init];

NSMutableString * name = [[NSMutableStringalloc]initWithString:@"xiaoming"];

//    name.string = @"xiaoming";

    xiaoMing.name = name;

NSLog(@"%@", xiaoMing.name);

    [name appendString:@"hah"];

// 此时名字这个属性被修改了

NSLog(@"%@", xiaoMing.name);

如果用Copy来修饰name这个属性不会改变,如果使用Strong,当name这个字符串改变的时候,name这个属性也会随着改变。

xiaoMing.name = name;(此时name是用copy修饰的)    等同于  xiaoMing.name = [name copy];(copy对可变对象进行的是深拷贝,此时是拷贝出了一个新的对象然后赋值给了xiaoMing.name   mutableCopy对所有的对象进行的都是深拷贝)

补充:这其实也是看需求,看被赋值的字符串是否需要随着赋值字符串的变化而变化,而大多数情况下我们不希望被赋值的字符串如某个对象的某个字符串类型的属性会随着赋值字符串的变化而变化。  反之,如果我们希望被赋值的字符串随着赋值字符串的变化而变化,那么我们也可以使用strong来修饰字符串(赋值字符串和被赋值字符串说的好像挺绕口啊)。注:赋值字符串既然可变,那它就必然是可变字符串。

至于其底层原理区别则是两种修饰方式让指针指向的内存地址不同。使用copy修饰被赋值字符串,被修饰字符串会对赋值字符串(可变字符串)进行一次深拷贝,那么被赋值字符串和赋值字符串指向的是完全不同的两块内存地址,反之两者指向的同一块内存地址。

当我们确定赋值字符串是不可变字符串的时候我们是可以使用strong来修饰字符串。

联想:由copy修饰字符串想到的用strong修饰数组,原理是一样的,当我们用strong来修饰不可变数组的时候,如果赋值数组是可变数组,那么被赋值数组同样会随着可变数组的变化而变化。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏土豆专栏

Java面试之数据类型(一)

封装类是引用类型,基本类型在传递参数的时候都是按值传递,而封装类型是按引用传递的(其实引用也是按值传递的,但是传递的是对象的地址)

20720
来自专栏landv

Java基本语法

17610
来自专栏blackheart的专栏

[C#1] 2-类型基础

1.System.Object CLR要求每个类型都要继承自System.Object[直接或者间接方式],如果不显示继承,编译器会自动为我们添加对System...

20570
来自专栏web前端

JavaScript基础学习--14 json、数组

Demos:   https://github.com/jiangheyan/JavaScriptBase 一、json      1、格式与取值:{key:...

281100
来自专栏java初学

final关键字

403120
来自专栏desperate633

深入理解javascript中的继承机制(4)多继承寄生式继承借用构造函数借用构造函数并且复制原型以上

我们知道多继承是面向对象的语言中比较纠结的一个问题,有好处也存在缺陷。这方面我们不多讨论。就javascript而言,要实现多继承是比较简单的,因为javasc...

8610
来自专栏我的博客

插入排序

原理: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素,...

26260
来自专栏java学习

面试題5(请说出Java 语言中覆盖和重事)

考点:考察求职者对于Java重载和覆盖的区分。 出现频率: ★★★ 【面试题解析】考察求职者对于Java 重载和覆盖的区分。从前面对重载和覆盖的描述,很容易就能...

30080
来自专栏IMWeb前端团队

JSON Schema 参考书

本文作者:IMWeb 孙世吉 原文出处:IMWeb社区 未经同意,禁止转载 1 简介 JSON 模式(JSON Schema)是一种基于 JSON 格...

414100
来自专栏黑泽君的专栏

c语言基础学习06_函数

============================================================================= 涉及...

42320

扫码关注云+社区

领取腾讯云代金券