![](/img/trans.png)
[英](nonatomic, readwrite, retain) and (nonatomic, strong) in Objective-C ARC
[英]@property retain, assign, copy, nonatomic in Objective-C
作為Objective-C的新手,有人可以給我一個關於保留、分配、復制以及我遺漏的任何其他內容的概述,遵循@property指令嗎? 他們在做什么,為什么我要使用一個而不是另一個?
在了解@property 的屬性之前,您應該知道@property 的用途是什么。
@property提供了一種定義類要封裝的信息的方法。 如果您使用@property聲明一個對象/變量,那么導入其類的其他類將可以訪問該對象/變量。
如果你在頭文件中使用@property聲明一個對象,那么你必須在實現文件中使用@synthesize來合成它。 這使得對象KVC 兼容。 默認情況下,編譯器會為此對象合成訪問器方法。
訪問器方法是:setter 和 getter。
示例:.h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
現在編譯器將為name合成訪問器方法。
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
@property的屬性列表
原子、非原子、保留、復制、只讀、讀寫、分配、強、getter=method、setter=method、unsafe_unretained
atomic是默認行為。 如果一個對象被聲明為原子的,那么它就成為線程安全的。 線程安全意味着,一次只有該類特定實例的一個線程可以控制該對象。
如果線程正在執行 getter 方法,則其他線程無法對該對象執行 setter 方法。 它很慢。
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
出於這個原因,訪問非原子屬性比訪問原子屬性更快。
@property (nonatomic)NSString *name;
setter 方法會增加對象的保留計數,使其在自動釋放池中占用內存。
@property (retain)NSString *name;
即使設置了可變字符串並隨后更改,該實例也會捕獲它在設置時的任何值。 不會合成 setter 和 getter 方法。
@property (copy) NSString *name;
現在,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
名稱將不受影響。
編譯器將生成一個 getter,但不會生成一個 setter。
@property (readonly) NSString *name;
它與只讀相反。
@property (readwrite) NSString *name;
請記住,啟用垃圾收集時,保留和分配基本上可以互換。
@property (assign) NSInteger year;
它帶有ARC。
@property (nonatomic, strong) AVPlayer *player;
對於布爾屬性(具有 YES 或 NO 值的屬性),getter 方法通常以單詞“is”開頭
@property (getter=isFinished) BOOL finished;
該方法應以冒號結尾。
@property(setter = boolBool:) BOOL finished;
不安全引用類似於弱引用,因為它不會保持其相關對象的活動狀態,但如果目標對象被釋放,則不會將其設置為nil 。
@property (unsafe_unretained) NSObject *unsafeProperty;
如果您需要指定多個屬性,只需將它們作為逗號分隔的列表包含,如下所示:
@property (readonly, getter=isFinished) BOOL finished;
MrMage 鏈接的文章不再有效。 所以,這是我在 Objective-C 中(非常)短時間編碼中學到的東西:
非原子與原子 - “原子”是默認值。 始終使用“非原子”。 我不知道為什么,但我讀過的書說“很少有理由”使用“原子”。 (順便說一句:我讀的書是 BNR“iOS 編程”書。)
readwrite 與 readonly - “readwrite”是默認值。 當您@synthesize 時,將為您創建一個 getter 和一個 setter。 如果您使用“只讀”,則不會創建任何 setter。 將它用於您不想在對象實例化后更改的值。
保留與復制與分配
看了很多文章我決定把所有的屬性信息放在一起:
- 原子 //默認
- 非原子的
- 強=保留//默認
- 弱 = unsafe_unretained
- 保持
- 賦值 //默認
- unsafe_unretained
- 復制
- 只讀
- 讀寫 //默認
下面是詳細文章的鏈接,您可以在其中找到這些屬性。
非常感謝所有在這里給出最佳答案的人!!
這是文章中的示例描述
例子 :
@property (retain) NSString *name;
@synthesize name;
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
解釋:
假設有一個原子字符串屬性叫做“name”,如果你從線程A調用[self setName:@"A"],從線程B調用[self setName:@"B"],然后從線程調用[self setName:@"B"]線程C,那么對不同線程的所有操作將串行執行,這意味着如果一個線程正在執行setter或getter,則其他線程將等待。 這使得屬性“name”讀/寫安全,但如果另一個線程 D 同時調用 [name release] ,則此操作可能會導致崩潰,因為此處不涉及 setter/getter 調用。 這意味着一個對象是讀/寫安全 (ATOMIC) 但不是線程安全的,因為另一個線程可以同時向該對象發送任何類型的消息。 開發人員應確保此類對象的線程安全。
如果屬性“name”是非原子的,那么上例中的所有線程——A、B、C 和 D 將同時執行,產生任何不可預測的結果。 在原子的情況下,A、B 或 C 中的任何一個將首先執行,但 D 仍然可以並行執行。
例子:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
例子 :
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
強弱解釋,感謝 BJ Homer :
想象一下我們的對象是一只狗,而這只狗想要逃跑(被釋放)。 強指針就像狗的皮帶。 只要你把皮帶拴在狗身上,狗就不會逃跑。 如果五個人將他們的皮帶拴在一只狗上(五個強烈的指針指向一個物體),那么在所有五根皮帶都松開之前,狗不會逃跑。 另一方面,弱指針就像小孩子指着狗說“看!一只狗!” 只要狗仍然被拴在皮帶上,小孩子仍然可以看到狗,他們仍然會指向它。 然而,一旦所有的皮帶都松開了,不管有多少小孩指着它,這只狗都會逃跑。 一旦最后一個強指針(leash)不再指向一個對象,該對象將被釋放,所有弱指針將被清零。 當我們使用弱? 您唯一想要使用弱的情況是,如果您想避免保留循環(例如,父項保留子項而子項保留父項,因此兩者都不會被釋放)。
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
例子:
@property (nonatomic, assign) NSString *address;
@synthesize address;
unsafe_unretained
-unsafe_unretained 是所有權限定符,它告訴 ARC 如何插入保留/釋放調用 -unsafe_unretained 是分配的 ARC 版本。
例子:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
例子:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
原子屬性一次只能被一個線程訪問。 它是線程安全的。 默認是 atomic 。請注意沒有關鍵字atomic
非原子意味着多個線程可以訪問該項目。它是線程不安全的
所以在使用 atomic 時應該非常小心。因為它會影響代碼的性能
更喜歡這個關於iOS中objective-c屬性的鏈接......
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.