美文网首页
strong和copy的用法

strong和copy的用法

作者: 萧修 | 来源:发表于2018-06-05 14:34 被阅读58次

    一、提出问题。

    问题一:

    一个对象 的字符串用 copy进行修饰,外界修改这个字符串的数值,会导致引用的这个字符串数值修改吗?

    NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy

    NSString *stringCopy = [string copy];

    [string appendString:@"origion!"]

    1、string的内存地址和stringCopy的是否一样?

    2、此时stringCopy的打印内容是什么?

    问题二、

    @property(nonatomic,copy)NSString * str1;

    @property(nonatomic,strong)NSString*str2;

    NSMutableString*str=[NSMutableString stringWithFormat:@"helloworld"];

    self.str1=str;

    self.str2=str;

    1、str和str1的内存地址和str和str2的内存地址,是什么关系,相等,不相等?

    2、[str appendString:@"hry"],经过这个方法之后,str1和str2的数值分别是多少?是不是都是 helloworldhry。

    二、解决问题

    字典,数组,字符串都有可变对象。

    1、当我们把 可变对象通过 copy赋值一个 不可变对象或者可变对象,是深复制,也就是地址复制了一份,避免了原始可变对象的修改引起后来copy的对象的修改,上述问题2,srt1是属性copy,所以str的的变化不会引起str2的变化。但是str2使用 strong修饰,因为是地址复制了一份,指向的是同一块内容。原来地址内容发生变化,它的内容也会变化。

    2、区分源头,上述是讲的可变对象,对于源头是不可变的对象,copy和strong修饰的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。

    三、为什么有这两个属性修饰

    应该是用的场景不一样,当我们改变源头(源头是可变的)的时候,也期望引用这个源头的所有对象都会随着改变。而strong修饰象实现了这次的跟随改变。如果你用copy修饰不可变对象的话,copy产生的对象是不可变的,修饰可变对象发生崩溃。

    源头对象用什么修饰,传递对象用什么修饰,最终使用对象用什么修饰。使用的对象希望跟随源头变化进行,中间属性修饰最好用strong,一层层传递。也可以采用其他编程方法。

    本文侧重,讲述copy和strong的区别和用法。场景很多。

    相关文章

      网友评论

          本文标题:strong和copy的用法

          本文链接:https://www.haomeiwen.com/subject/hkgpsftx.html