簡體   English   中英

讀寫屬性和非原子分配屬性有什么區別?

[英]what is the difference between a readwrite property and a nonatomic assign property?

我已經看到 int、BOOL 等與非原子、分配相同的讀寫。

我對此有些困惑。 我知道在非原生對象上,我們通常會做非原子的,保留。

這是簡短的答案:

atomic vs nonatomic主要確保從合成的 getter 返回完整的值,並且完整的值由合成的 setter 寫入(默認為 atomic。)

readwritereadonly確定合成屬性是否具有合成訪問器(readwrite 有一個 setter 並且是默認值,readonly 沒有)。

assign vs retain vs copy決定了合成訪問器如何與 Objective-C memory 管理方案交互:

  • assign是默認值,只是執行變量賦值
  • retain指定應發送新值 -retain 分配並發送舊值-release
  • copy指定應在分配時發送新值 -copy 並發送舊值-release

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

  1. 原子的 //默認
  2. 非原子的
  3. 強=保留//默認
  4. 弱= unsafe_unretained
  5. 保持
  6. 賦值 //默認
  7. unsafe_unretained
  8. 復制
  9. 只讀
  10. 讀寫//默認

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

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

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

例子:

@property (nonatomic, retain) NSString *name;

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

例子:

@property (nonatomic, assign) NSString *address;

@synthesize address;
  1. 只讀

    • 將您的屬性聲明為只讀,您會告訴編譯器不要自動生成 setter 方法。
    • 指示該屬性是只讀的。
    • 如果您指定只讀,則 @implementation 塊中只需要一個 getter 方法。 如果在@implementation 塊中使用@synthesize 指令,則只會合成getter 方法。 此外,如果您嘗試使用點語法分配值,則會出現編譯器錯誤。

例子:

@property (nonatomic, readonly) NSString *name;

@synthesize name;
  1. 讀寫
    • 生成的 setter 和 getter。
    • 指示該屬性應被視為讀/寫。
    • 此屬性是默認值。
    • @implementation 塊中需要 getter 和 setter 方法。 如果您在實現塊中使用@synthesize 指令,則會合成getter 和setter 方法。

例子:

@property (nonatomic, readwrite) NSString *name;

@synthesize name;

readwrite意味着 getter 和 setter 都存在; 相反的是readonly 通常,您唯一一次顯式聲明屬性readwrite是在 class 的 class 擴展中,其中公共接口將屬性聲明為readonly - 因此它是公開只讀的,但在內部您可以獲取和設置。

暫無
暫無

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

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