[英]Objective-C 101 (retain vs assign) NSString
101問
假設我正在建立汽車數據庫,每個汽車對象定義為:
#import <UIKit/UIKit.h>
@interface Car:NSObject{
NSString *name;
}
@property(nonatomic, retain) NSString *name;
為什么是@property(nonatomic, retain) NSString *name;
而不是@property(nonatomic, assign) NSString *name;
?
我知道assign
不會像retain
一樣增加參考計數器。 但是為什么要使用retain
,因為name
是todo
對象的成員,所以它的范圍就是它自己。
其他任何外部功能也不會對其進行修改。
在Objective-C中,沒有“對象范圍”之類的東西。 范圍規則與對象的生存期無關—保留計數就是一切。
通常,您需要聲明實例變量的所有權。 請參閱Objective-C內存管理規則 。 有了retain
財產,您的財產設定者會要求擁有新價值,而放棄舊價值。 使用assign
屬性,周圍的代碼必須執行此操作,就責任和關注點分離而言,情況同樣如此。 使用assign
屬性的原因是在無法保留該值的情況下(例如BOOL或NSRect等非對象類型),或者在保留該值時會導致不良的副作用。
順便說一句,對於NSString,通常正確的屬性是copy
。 這樣,如果有人傳入NSMutableString(這是有效的-這是一種NSString),它就不會從您的下方改變。
並且不要忘記通過訪問它
self.name = something;
因為
name = something;
不會關心生成的setter / getter方法,而是直接分配值。
如果沒有retain
,則不能保證您設置name
的NSString*
壽命將比賦值語句本身更長。 通過對合成的setter使用retain
屬性,您可以讓它告訴內存管理系統至少還有一個對象有興趣保留NSString*
。
對於那些正在尋找它的人,Apple的屬性屬性文檔在這里 。
self.
在:
self.name = something;
重要! 沒有它,您將直接訪問變量並繞過setter。
較舊的樣式(如果我錯了,請糾正我)是:
[self setName:something];
無論如何,這種表示法是我在NSStrings
上尋找適當的@properties
時真正需要的(有點熟悉的聽起來)建議。 謝謝阿克塞爾。
閱讀了這么多文章,SO帖子並制作了演示應用程序以檢查Variable屬性后,我決定將所有屬性信息放在一起
因此,下面是詳細的文章鏈接,您可以在其中找到上述所有屬性,這些都會對您有幫助。 非常感謝在這里給出最佳答案的所有人!!
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
Google的《 Objective-C風格指南》涵蓋了以下方面:
使用NSString的設置者應始終復制其接受的字符串。 永遠不要只保留字符串。 這樣可以避免呼叫者在您不知情的情況下更改它。 不要以為是因為您接受的NSString實際上不是NSMutableString。
如果您的班級得到了這個字符串對象,然后又從下面消失了,那會很不幸嗎? 您知道嗎,就像您的類第二次提到該對象一樣,它又被另一個對象取消分配了?
這就是為什么要使用retain
設置器語義的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.