iOS關(guān)鍵字-strong和copy

一、提出問題。

問題一:

一個對象 的字符串用 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ū)別和用法。場景很多。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容