宣告 NSString 型別的屬性,到底用 strong 還是 copy ?

README發表於2019-03-02

按理說,這都 9102 年了,還討論這種問題,實在不太合適。可是最近在一些技術群裡,卻因這個問題炸開了鍋,雙方各執一詞,誰也說服不了誰。那麼,宣告 NSString 型別的屬性,到底用 strong 還是 copy 呢?我們看看下面這個故事:

小張寫了個庫,裡面有這樣一段程式碼:

宣告 NSString 型別的屬性,到底用 strong 還是 copy ?

有一天,小王用到了這個庫。

宣告 NSString 型別的屬性,到底用 strong 還是 copy ?

小王:小張啊,你這個庫有問題。

小張:什麼問題啊?

小王:你把 name 屬性宣告成 strong 了,應該用 copy 的![偷笑]

小張:為什麼應該用 copy 啊?

小王:你看這段程式碼,我修改了 mStr 的值, 但是 tom.name 的值也發生了改變!

小張:恩,是改變了。這樣有什麼問題呢?

小王:還看不出問題嗎!我是不希望 tom.name 的值改變的,但現在卻改變了!

小張:是你自己修改的啊。如果你不希望它的值改變,為什麼要修改它呢?

小王:你把 name 屬性宣告成 copy 不就不會改變了嗎!

小張:可我怎麼知道你要不要改變呢?這個值要不要改變是你控制的啊!我在庫的內部只做讀取操作,並沒有做修改操作。

小王:總之現在出了問題,這就是你的問題!

小張:你自己建立的可變物件,然後你自己把它的值改變了,為什麼是我的問題啊?

小王:你的意思是我甩鍋?

一場大戰......

這時,小李走了過來,瞭解情況後

小李:小王啊,你的程式碼為什麼要這麼寫啊?

小王:為什麼不能這麼寫?

小李:作為程式設計師,我們一定要清楚自己的程式碼發生了什麼!你這段程式碼,從邏輯層面講,類似於下面這樣

宣告 NSString 型別的屬性,到底用 strong 還是 copy ?

小王:這怎麼一樣呢?一個重新賦值,一個沒有!

小李:重新賦值是將指標指向了新的記憶體空間,而你修改可變物件 mStr 的內容是直接更改原有記憶體空間的內容,都是修改內容,只是方式不一樣而已。最重要的是,這塊記憶體是你(呼叫方)申請的,本著“誰申請,誰管理”的原則,這塊記憶體的內容是否修改也應該是你(呼叫方)來管理的。

感慨:遇事自己思考,反對教條主義、本本主義。

相關文章