strong和copy的用法

2018-06-05  本文已影响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的区别和用法。场景很多。

上一篇下一篇

猜你喜欢

热点阅读