[英]Weak and strong property setter attributes in Objective-C
[英]Objective-C declared @property attributes (nonatomic, copy, strong, weak)
當我必須對聲明的屬性使用每個屬性時,有人可以向我詳細解釋: nonatomic
、 copy
、 strong
、 weak
等,並解釋每個屬性的作用嗎? 某種例子也會很棒。 我正在使用 ARC。
Nonatomic
不會通過@synthesize
訪問器生成線程安全例程。 atomic
將生成線程安全訪問器,因此atomic
變量是線程安全的(可以從多個線程訪問而不會損壞數據)
當對象可變時需要copy
。 如果您需要當前對象的值,並且您不希望該值反映該對象的其他所有者所做的任何更改,請使用此選項。 完成后您需要釋放對象,因為您保留了副本。
Assign
與copy
有點相反。 當調用assign
屬性的 getter 時,它返回對實際數據的引用。 通常,當您擁有原始類型的屬性(float、int、BOOL...)時,您會使用此屬性
當屬性是指向在堆上分配的引用計數對象的指針時,需要retain
。 分配應類似於:
NSObject* obj = [[NSObject alloc] init]; // ref counted var
@synthesize
生成的 setter 將在復制對象時為其添加引用計數,因此如果原始副本超出范圍,則底層對象不會自動銷毀。
完成后,您需要釋放對象。 @property
s 使用retain
會增加引用計數並占用自動釋放池中的內存。
strong
是保留屬性的替代品,作為 Objective-C 自動引用計數 (ARC) 的一部分。 在非 ARC 代碼中,它只是保留的同義詞。
這是一個很好的網站,了解strong
和weak
的iOS 5http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
虛弱的
weak
與strong
相似,只是它不會將引用計數增加 1。它不會成為該對象的所有者,而只是持有對它的引用。 如果對象的引用計數下降到 0,即使您可能仍然在此處指向它,它也會從內存中釋放。
上面的鏈接包含關於弱和強的好信息。
nonatomic
屬性意味着@synthesize
d 方法不會被生成線程安全——但這比atomic
屬性要快得多,因為額外的檢查被消除了。
strong
與 ARC 一起使用,它基本上可以幫助您,而不必擔心對象的保留計數。 當您完成它時,ARC 會自動為您釋放它。使用關鍵字strong
表示您擁有該對象。
weak
所有權意味着您不擁有它,它只是跟蹤對象,直到分配給它的對象保持不變,一旦第二個對象被釋放,它就會失去價值。 例如。 obj.a=objectB;
被使用並且 a 具有弱屬性,它的值只有在 objectB 保留在內存中時才有效。
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.