簡體   English   中英

Objective-C:標量屬性默認為原子?

[英]Objective-C: Defaults to atomic for scalar properties?

一位朋友告訴我,標量屬性的@property默認值(BOOL,NSInteger等)是非原子的。 也就是說,

@property BOOL followVenmo;

默認為

@property (nonatomic) BOOL followVenmo;

但是,我總是認為默認值始終是原子,標量或不是。

這是什么?

小心這個“標量”術語。 NSString *屬性也是一個指針,與您提供的指向BOOL的示例完全相同。

來自Apple文檔:( Objective-C編程語言)

如果指定retaincopy並且未指定nonatomic ,則在引用計數環境中, 對象屬性的合成get訪問器使用保留並自動釋放返回的值 - 實現將類似於以下內容:

[_internal lock]; // lock using an [_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

您不能在不是對象的東西中應用對象級鎖定,因此原始類型屬性中的(非)原子基本上沒有效果。

您可以得出結論, 原子只適用於對象屬性,這在文檔中得到了加強:

如果指定nonatomic ,則對象屬性合成訪問器只是直接返回值。

為了澄清你是否應該指定一個或另一個:從技術上講,沒有nonatomic屬性被認為是原子的 ,但請記住它對原始類型沒有意義。 因此,您可能希望保存一些打字並避免在這些中使用nonatomic

基於我對其他一些相關問題的研究:

我將遵守@ Rhubarb的建議

根據經驗,如果您不需要多線程支持 - 如果您在UIViewControllers等UI代碼中工作,通常不需要多線程支持,那么只需將其聲明為非原子的。

來自開發人員文檔

nonatomic指定訪問器是非原子的。 默認情況下,訪問器是原子的。

原子屬性可確保您獲得或設置整個值。 例如,從2個線程設置CGRect將最終得到一個或另一個,而不是兩者的某種組合。

對於保留的屬性,它還確保結果可以比接收器壽命長。 例如,您從調用完成之前由另一個線程釋放的對象獲得結果,但結果將保留並代表您自動釋放,因此它仍然有效。

暫無
暫無

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

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