簡體   English   中英

Objective-C 101(保留與分配)NSString

[英]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 ,因為nametodo對象的成員,所以它的范圍就是它自己。

其他任何外部功能也不會對其進行修改。

在Objective-C中,沒有“對象范圍”之類的東西。 范圍規則與對象的生存期無關—保留計數就是一切。

通常,您需要聲明實例變量的所有權。 請參閱Objective-C內存管理規則 有了retain財產,您的財產設定者會要求擁有新價值,而放棄舊價值。 使用assign屬性,周圍的代碼必須執行此操作,就責任和關注點分離而言,情況同樣如此。 使用assign屬性的原因是在無法保留該值的情況下(例如BOOL或NSRect等非對象類型),或者在保留該值時會導致不良的副作用。

順便說一句,對於NSString,通常正確的屬性是copy 這樣,如果有人傳入NSMutableString(這是有效的-這一種NSString),它就不會從您的下方改變。

並且不要忘記通過訪問它

self.name = something;

因為

name = something;

不會關心生成的setter / getter方法,而是直接分配值。

如果沒有retain ,則不能保證您設置nameNSString*壽命將比賦值語句本身更長。 通過對合成的setter使用retain屬性,您可以讓它告訴內存管理系統至少還有一個對象有興趣保留NSString*

對於那些正在尋找它的人,Apple的屬性屬性文檔在這里

self. 在:

self.name = something;

重要! 沒有它,您將直接訪問變量並繞過setter。

較舊的樣式(如果我錯了,請糾正我)是:

[self setName:something];

無論如何,這種表示法是我在NSStrings上尋找適當的@properties時真正需要的(有點熟悉的聽起來)建議。 謝謝阿克塞爾。

閱讀了這么多文章,SO帖子並制作了演示應用程序以檢查Variable屬性后,我決定將所有屬性信息放在一起

  1. 原子//默認
  2. 非原子
  3. strong =保留//默認
  4. 弱=不安全_未保留
  5. 保留
  6. 分配//默認
  7. unsafe_unretained
  8. 復制
  9. 只讀
  10. readwrite //默認

因此,下面是詳細的文章鏈接,您可以在其中找到上述所有屬性,這些都會對您有幫助。 非常感謝在這里給出最佳答案的所有人!!

iOS中的可變屬性屬性或修飾符

  1. 保留=強
    • 保留它,釋放舊值並分配它
    • 保留指定新值應發送-保留分配和舊值發送-release
    • 保留與堅強相同。
    • 蘋果說,如果您寫保留,它將自動轉換/僅像強一樣工作。
    • 像“分配”這樣的方法包括一個隱式的“保留”

例:

@property (nonatomic, retain) NSString *name;

@synthesize name;
  1. 分配
    • 指定是默認值,僅執行變量分配
    • Assign是一個屬性屬性,它告訴編譯器如何綜合該屬性的setter實現
    • 我將對C基本屬性使用assign,對Objective-C對象的弱引用使用weak。

例:

@property (nonatomic, assign) NSString *address;

@synthesize address;

Google的《 Objective-C風格指南》涵蓋了以下方面:

使用NSString的設置者應始終復制其接受的字符串。 永遠不要只保留字符串。 這樣可以避免呼叫者在您不知情的情況下更改它。 不要以為是因為您接受的NSString實際上不是NSMutableString。

如果您的班級得到了這個字符串對象,然后又從下面消失了,那會很不幸嗎? 您知道嗎,就像您的類第二次提到該對象一樣,它又被另一個對象取消分配了?

這就是為什么要使用retain設置器語義的原因。

暫無
暫無

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

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