[英]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.