簡體   English   中英

Objective-C中用於復制屬性的自定義設置器

[英]Custom setter for copy property in objective-c

我是否必須在Objective-C中使用具有復制屬性的自定義設置器手動復制對象? 例如,

我有一個財產:

@property (copy, nonatomic) NSString *someString;

和自定義設置器:

- (void)setSomeString:(NSString *)someString
{
  //option 1
  _someString = someString;
  //option 2
  _someString = [someString copy];
  //do other stuff
}

選項1是否足以用於自定義設置器,或者我必須使用選項2才能復制對象?

您可以做任何您想做的事,但應該使用第二種選擇。 這是因為,如果其他開發人員看到它,它將像代碼文檔一樣,他或她將知道您僅查看以下內容即可復制字符串:

@property (copy, nonatomic) NSString *someString;

如果使用保留/分配,則相同,最佳做法是在自定義設置器中保留/分配對象。 這將使您的代碼更清晰,文檔更豐富,其他開發人員也更容易理解。

您必須使用“選項2”,因為您正在對屬性和語句使用“復制”:

_someString = [someString copy];

會在內存中創建一個新對象並將其分配給您的屬性對象。

如果您編寫自己的自定義設置器,那么您將對其所做的一切負責100%。 在您的情況下,您對代碼選項1中引入的錯誤負100%的責任:如果我將someObject.someString設置為可變字符串,然后再更改該字符串,則對象中的字符串將改變,這絕對是肯定的不是您對復制屬性的期望。

另外,如果您同時具有一個自定義的setter和getter(或一個只讀屬性的自定義的getter),則沒有編譯器生成的getter或setter,則編譯器不會為您創建實例變量。 您必須自己做。

您還應該注意,對不可變對象的“復制”實際上並不復制它們,而是保留它們,因此通常,“復制”操作確實很便宜,並且當我傳遞可變對象時,“復制”很可能就是您想要的無論如何。

如果您想創建自己的二傳手,但不要忘記在語句之前添加條件,請選擇選項2。

if(_someString) {
    [_someString release]; 
}

注意:-如果是ARC,請使用語句“ _someString = nil ”代替“ [_someString release] ”;

暫無
暫無

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

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