一、提出問題。
問題一:
一個對象 的字符串用 copy進行修飾,外界修改這個字符串的數(shù)值,會導(dǎo)致引用的這個字符串?dāng)?shù)值修改嗎?
NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy
NSString *stringCopy = [string copy];
[string appendString:@"origion!"]
1、string的內(nèi)存地址和stringCopy的是否一樣?
2、此時stringCopy的打印內(nèi)容是什么?
問題二、
@property(nonatomic,copy)NSString * str1;
@property(nonatomic,strong)NSString*str2;
NSMutableString*str=[NSMutableString stringWithFormat:@"helloworld"];
self.str1=str;
self.str2=str;
1、str和str1的內(nèi)存地址和str和str2的內(nèi)存地址,是什么關(guān)系,相等,不相等?
2、[str appendString:@"hry"],經(jīng)過這個方法之后,str1和str2的數(shù)值分別是多少?是不是都是 helloworldhry。
二、解決問題
字典,數(shù)組,字符串都有可變對象。
1、當(dāng)我們把 可變對象通過 copy賦值一個 不可變對象或者可變對象,是深復(fù)制,也就是地址復(fù)制了一份,避免了原始可變對象的修改引起后來copy的對象的修改,上述問題2,srt1是屬性copy,所以str的的變化不會引起str2的變化。但是str2使用 strong修飾,因為是地址復(fù)制了一份,指向的是同一塊內(nèi)容。原來地址內(nèi)容發(fā)生變化,它的內(nèi)容也會變化。
2、區(qū)分源頭,上述是講的可變對象,對于源頭是不可變的對象,copy和strong修飾的變量,當(dāng)?shù)诙卧搭^的字符串重新指向其它的地方的時候,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用,也就是淺拷貝。
三、為什么有這兩個屬性修飾
應(yīng)該是用的場景不一樣,當(dāng)我們改變源頭(源頭是可變的)的時候,也期望引用這個源頭的所有對象都會隨著改變。而strong修飾象實現(xiàn)了這次的跟隨改變。如果你用copy修飾不可變對象的話,copy產(chǎn)生的對象是不可變的,修飾可變對象發(fā)生崩潰。
源頭對象用什么修飾,傳遞對象用什么修飾,最終使用對象用什么修飾。使用的對象希望跟隨源頭變化進行,中間屬性修飾最好用strong,一層層傳遞。也可以采用其他編程方法。
本文側(cè)重,講述copy和strong的區(qū)別和用法。場景很多。