NSString為何要用copy?而不是strong?

時間 2021-05-31 13:46:28

1樓:人生無趣

一直不理解這個問題,不就是想說明copy和strong的區別麼。為什麼nsstring就一定要用copy,我用strong怎麼就不行了,自己知道用strong要避免被更改了不就行了麼。

2樓:CCh

就是C指標的原理吧!給指標變數賦了乙個位址,通過修改*指標變數,間接修改了那個位址下對應的值吧!

IOS裡簡單說就是,數字和字串本身設為不可變。別人想用,可以,拿我副本用,但是拿我副本用的時候會支會我本體一聲讓我知道你在用(本體引用計數依然+1)。最後本體銷毀的時候,副本一同銷毀。

[若我理解有錯煩請大牛指出!]

不過我有個疑問,拷貝出來的分身應該要協同本體一起銷毀,那分身和本體之間應有何種聯絡?

3樓:申瑞傑

這裡寫的很深入看一下就懂了

4樓:章橙汁

原答案說的並不是那麼清晰,我想通過乙個最簡單的例子來說明它們的區別:

首先我們來看看使用strong會出現什麼樣的情況:

.h@property (nonatomic, strong) NSString *name;

.mNSMutableString *mStr = [NSMutableString stringWithString:@"張三"];

self.name = mStr;

NSLog(@"使用strong第一次得到的名字:%@", self.name);

NSLog(@"使用strong第二次得到的名字:%@", self.name);

列印結果:

2017-04-07 16:20:10.138793 copyTest[2421:682898] 使用strong第一次得到的名字:張三

2017-04-07 16:20:10.138884 copyTest[2421:682898] 使用strong第二次得到的名字:張三丰

結論:通過上面的例子我們可以看出,我們在沒有直接修改 self.name 的情況下 self.

name 卻被修改了,就好像乙個人的名字怎麼能沒有經過自己同意就被修改呢?我們的初衷只是想修改mStr,但是 self.name 卻被意外的修改了,而這就是我們使用strong所不想看到的,它會破壞程式的封裝性。

(使用strong後 self.name 和 mStr 指向的是同一片記憶體,所以修改其中乙個值後兩個值就都變了)

那麼使用copy又會得到什麼結果呢?下面是使用copy的例子:

.h@property (nonatomic, copy) NSString *name;

.mNSMutableString *mStr = [NSMutableString stringWithString:@"張三"];

self.name = mStr;

NSLog(@"使用copy第一次得到的名字:%@", self.name);

NSLog(@"使用copy第二次得到的名字:%@", self.name);

列印結果:

2017-04-07 16:35:04.012589 copyTest[2428:685221] 使用copy第一次得到的名字:張三

2017-04-07 16:35:04.012676 copyTest[2428:685221] 使用copy第二次得到的名字:張三

結論:這個例子中我們使用了copy修飾,mStr通過copy得到了乙個新的物件賦值給 self.name 這樣我們再修改mStr就跟 self.

name 沒關係了,只有直接對 self.name 進行賦值才能改變它的值,這樣就保證了程式的封裝性。

為什麼使用copy而不是strong以上只是乙個例子,還有很多情況可以自己去試試,並且可以把屬性型別改成NSMutableString進行不同情況的研究,也可以更加深入理解深拷貝和淺拷貝的含義。

5樓:tauCross

copy會重新生成乙個string,被copy的物件發生改變時,copy後的物件不改變

strong僅僅進行強引用確保持有string的物件在生存期間這個string不會被釋放

題主說的問題有點問題,應該是NSString用copy或strong都可以,下面分場景說:

必須使用copy的場景:A物件持有string記做A.string,然後賦值給B物件,記做B.

string,若希望B.string的內容改變時A.string不改變就必須用copy

必須用strong的場景:若希望B.string的內容改變時同時A.string也改變則必須用strong

隨便用哪個的場景:string的內容不會被改變的情況下

以上規則不止適用於NSString,NSArray,NSDictionary等同理

6樓:浪人

NSString本身是無所謂的,但是如果乙個 NSString 指標指向了乙個 NSMutableString的記憶體空間的話,如果使用 strong 修飾的話,如果你在別處修改這個值的話,那麼原來的值也會改變。用 copy 是生成了乙份新的記憶體空間,所以原值不會改變

7樓:

很簡單,假如有乙個NSMutableString,現在用他給乙個retain修飾 NSString賦值,那麼只是將NSString指向了NSMutableString所指向的位置,並對NSMUtbaleString計數器加一,此時,如果對NSMutableString進行修改,也會導致NSString的值修改,原則上這是不允許的. 如果是copy修飾的NSString物件,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了乙份,兩者指向不同的位置,即使改變了NSMutableString的值,NSString的值也不會改變.

所以用copy是為了安全,防止NSMutableString賦值給NSString時,前者修改引起後者值變化而用的.

8樓:陳逸飛

It is common practice in Objective-C code to copy value objects—objects that represent attributes.

如果不想深入研究,記住上面這句就好了。

9樓:

strong和retain同義, weak和assign同義, 為什麼要採用這種說法, 似乎是ARC出現後為了消除引用計數的觀念而採用的做法. 至於為什麼要用copy, 由於純NSString是唯讀的, 所以strong和copy的結果一樣,據stackOverflow上的說法,是為了防止mutable string被無意中修改, NSMutableString是NSString的子類, 因此NSString指標可以持有NSMutableString物件.

為何要用術語來形容人呢?

林川登羅 你說的這個算是哲學中的一對二元對立 ontology 本體論 與existence 實存論或者存在論 注 古希臘的being被翻譯成存在,但這個being應該是屬於本體論範疇,所以我就用實存來描述好了。本體論簡單點解釋就是普遍主義,認為萬事萬物背後都有乙個 為什麼 從這個角度來看也是本質主...

為何有些父母要用言語傷害孩子,孩子重視的,諷刺。孩子喜歡在行動與精神方面處處阻撓。不參與孩子的生活。?

讓光照進來 我想絕大多數父母從意識層面都希望孩子將來能發展的比自己好,也希望他們對孩子的養育要比父母當年對自己的養育更勝一籌 尤其是那些對自己父母的養育不滿的家長們。可是讓人困擾的現實是 當自己成為家長後,往往會不由自主地重複當年父母的養育方式。除非ta能看到並理解自己曾經是在一種什麼樣的家庭模式中...

拍風景為了景深,開小光圈我懂 但是為何要用這麼高的快門和高感?

Cazi 除了圖二,我在圖一圖三圖四上都沒看到什麼近景,所以盲猜一波可能都是無人機拍攝或者航拍,如果是這樣那就很好解釋了。風景確實是沒動,但是你飛機是在運動的,有相對運動,就有可能產生動態模糊。所以用的高快門速度 不請自來強答一波,如果有錯誤望各位指正。 你老狗 服,200ISO也叫做這麼高。但也有...