簡體   English   中英

何時在objective-c中使用setter屬性'copy'?

[英]When to use setter attribute 'copy' in objective-c?

我知道通常你會使用NSStrings的副本 ,這樣你的屬性就會保持與分配它時相同的值,即使試圖在其他地方重新設置它。

但我很難完全理解這個概念。 這不適用於任何類型的對象(不僅僅是NSStrings)嗎?

所以我的問題是, “我應該將什么樣的屬性設置為'復制',為什么?”

簡單的數據對象(如字符串)不會引用應用程序中大量其他對象的對象非常適合復制。

當然,現在你可以保留像字符串這樣的東西。 這樣可以正常工作。 但是,如果你有一個可變的字符串,然后你修改了它。 現在,每個引用該字符串的其他對象都會看到該修改。 這可能不是你想要的。 這是復制“更簡單”的一個原因,因為對該數據的任何更改都本地化為該位代碼。

另一方面,假設您有一個為應用程序編寫的類的實例。 它引用了你應用中的其他對象,它有很多自己的字符串或其他值,它是一個復雜的野獸。 現在復制這個對象可能不是一個好主意。 如果您修改此對象,則可能希望更改傳播到包含引用的每個對象。 即使你復制了它,你需要一個淺拷貝(一個新的實例,但它的ivars引用相同的對象)或一個深拷貝(一個包含每個ivar的新副本的新實例)? 並且有問題的對象可能甚至不支持<NSCopying> ,這意味着它在技術上根本不能被復制。


總結一下:

  • copy :對象是小的,原子位的數據,沒有對其他對象的任何內部引用。
  • retain :幾乎所有其他類型的對象。

客戶端代碼可以將NSMutableString對象分配給NSString屬性。 如果屬性被定義為strong或其他非復制屬性,那么如果客戶端稍后更改了可變字符串,則屬性的值現在將不同。 通過將屬性設置為“復制”,可以生成字符串值的副本,這可以確保值不會在您的背后更改。

所以基本上你應該使用copy,只要屬性是一個具有可變對應類型的類型,並且你想確保值不會改變你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM