簡體   English   中英

Objective-C 聲明的@property 屬性(非原子、復制、強、弱)

[英]Objective-C declared @property attributes (nonatomic, copy, strong, weak)

當我必須對聲明的屬性使用每個屬性時,有人可以向我詳細解釋: nonatomiccopystrongweak等,並解釋每個屬性的作用嗎? 某種例子也會很棒。 我正在使用 ARC。

非原子的

Nonatomic不會通過@synthesize訪問器生成線程安全例程。 atomic將生成線程安全訪問器,因此atomic變量是線程安全的(可以從多個線程訪問而不會損壞數據)

復制

當對象可變時需要copy 如果您需要當前對象的值,並且您不希望該值反映該對象的其他所有者所做的任何更改,請使用此選項。 完成后您需要釋放對象,因為您保留了副本。

分配

Assigncopy有點相反。 當調用assign屬性的 getter 時,它返回對實際數據的引用。 通常,當您擁有原始類型的屬性(float、int、BOOL...)時,您會使用此屬性

保持

當屬性是指向在堆上分配的引用計數對象的指針時,需要retain 分配應類似於:

NSObject* obj = [[NSObject alloc] init]; // ref counted var

@synthesize生成的 setter 將在復制對象時為其添加引用計數,因此如果原始副本超出范圍,則底層對象不會自動銷毀。

完成后,您需要釋放對象。 @property s 使用retain會增加引用計數並占用自動釋放池中的內存。

強的

strong是保留屬性的替代品,作為 Objective-C 自動引用計數 (ARC) 的一部分。 在非 ARC 代碼中,它只是保留的同義詞。

這是一個很好的網站,了解strongweak的iOS 5http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

虛弱的

weakstrong相似,只是它不會將引用計數增加 1。它不會成為該對象的所有者,而只是持有對它的引用。 如果對象的引用計數下降到 0,即使您可能仍然在此處指向它,它也會從內存中釋放。

上面的鏈接包含關於弱和強的好信息

nonatomic屬性意味着@synthesize d 方法不會被生成線程安全——但這比atomic屬性要快得多,因為額外的檢查被消除了。

strong與 ARC 一起使用,它基本上可以幫助您,而不必擔心對象的保留計數。 當您完成它時,ARC 會自動為您釋放它。使用關鍵字strong表示您擁有該對象。

weak所有權意味着您不擁有它,它只是跟蹤對象,直到分配給它的對象保持不變,一旦第二個對象被釋放,它就會失去價值。 例如。 obj.a=objectB; 被使用並且 a 具有弱屬性,它的值只有在 objectB 保留在內存中時才有效。

copy屬性在這里得到了很好的解釋

strong,weak,retain,copy,assign是互斥的,所以你不能在一個對象上使用它們......閱讀“聲明的屬性”部分

希望這對你有所幫助...

此鏈接已分解

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

分配意味着 __unsafe_unretained 所有權。

復制意味着 __strong 所有權,以及 setter 上復制語義的通常行為。

保留意味着 __strong 所有權。

strong 意味着 __strong 所有權。

unsafe_unretained 意味着 __unsafe_unretained 所有權。

弱意味着__弱所有權。

很棒的答案! 我想更深入地澄清的一件事是nonatomic / atomic 用戶應該理解這個屬性 - “原子性”僅在屬性的引用上而不是在它的內容上傳播。 atomic將保證用戶讀取/設置指針的原子性,並且僅保證指向屬性的指針。 例如:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

在這種情況下,可以保證不同線程以原子方式讀取/設置指向dict的指針。 但是dict本身(字典dict指向)仍然是線程不安全的,即所有對字典的讀取/添加操作仍然是線程不安全的。

如果您需要線程安全的集合,您要么有糟糕的架構(更常見),要么有真正的需求(更罕見)。 如果它是“真正的需求” - 您應該找到良好且經過測試的線程安全集合組件,或者准備好編寫自己的組件以應對試驗和磨難。 后一種情況着眼於“無鎖”、“無等待”范例。 乍一看看起來像火箭科學,但與“通常的鎖定”相比,它可以幫助您實現出色的性能。

暫無
暫無

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

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