@property = ivar + getter + setter;
“屬性” (property)作為 Objective-C 的一項特性,次要的作用就在於封裝對象中的數據。 Objective-C 對象通常會把其所需求的數據保管為各種實例變量。實例變量普通經過“存取辦法”(Access method)來訪問。其中,“獲取辦法” (getter)用於讀取變量值,而“設置辦法” (setter)用於寫入變量值。這個概念曾經定型,並且經由“屬性”這一特性而成為 Objective-C 2.0 的一局部。 而在正軌的 Objective-C 編碼作風中,存取辦法有著嚴厲的命名標准。 正由於有了這種嚴厲的命名標准,所以 Objective-C 這門言語才干依據稱號自動創立出存取辦法。其實也可以把屬性當做一種關鍵字,其表示:
編譯器會自動寫出一套存取辦法,用以訪問給定類型中具有給定稱號的變量。 所以你也可以這麼說:@property = getter + setter;
自動分解when?
- 編譯期
@implementation Person
@synthesize firstName = _myFirstName;
@synthesize lastName = _myLastName;
@end
反編譯做了什麼
OBJC_IVAR_不是的
- atomic原子操作,零碎會為setter辦法加鎖。(但是也不平安,需求更深層次的鎖定)
- nonatomic不會為setter辦法加鎖。
- atomic:非線程平安,還是需求耗費少量零碎資源來為屬性加鎖
- nonatomic:非線程平安,合適內存較小的挪動設備
在ARC下,實例變量自身是強援用,當ARC將傳入值賦給實例變量時,它會保存傳入的值,釋放現有
實例變量的值。非ARC下,setter辦法會保存傳入的值和釋放現有實例變量的值。strong,retain
是同義詞。
假如是不可變的值,行為與strong相反。
假如是可變的值,會將一個正本賦給實例變量。當一個不可變類有一個可變的子類時
(NSString NSMutableString,NSArray NSMutableArray)可以避免setter 辦法傳遞一個
可變的子類的對象。會招致我們在不知情的狀況下修正對象的值。
在 ARC 中,在有能夠呈現循環援用的時分,往往要經過讓其中一端運用 weak 來處理,
比方: delegate 代理屬性
本身曾經對它停止一次強援用,沒有必要再強援用一次,此時也會運用 weak,
自定義 IBOutlet 控件屬性普通也運用 weak;當然,也可以運用strong。
@property有兩個對應的詞,一個是 @synthesize,一個是 @dynamic。假如 @synthesize和 @dynamic都沒寫,那麼默許的就是@syntheszie var = _var;
@synthesize 的語義是假如你沒有手動完成 setter 辦法和 getter 辦法,那麼編譯器會自動為你加上這兩個辦法。
@dynamic 通知編譯器:屬性的 setter 與 getter 辦法由用戶自己完成,不自動生成。(當然關於 readonly 的屬性只需提供 getter 即可)。假設一個屬性被聲明為 @dynamic var,然後你沒有提供 @setter辦法和 @getter 辦法,編譯的時分沒問題,但是當順序運轉到 instance.var = someVar,由於缺 setter 辦法會招致順序解體;或許當運轉到 someVar = var 時,由於缺 getter 辦法異樣會招致解體。編譯時沒問題,運轉時才執行相應的辦法,這就是所謂的靜態綁定。
@interface MyLabel ()
@property (nonatomic, strong) NSString *text;
@end
@implementation MyLabel
//必需用synthesize 手動指定ivar的名字就可以防止重載
@synthesize text = _myText;
@end
我的博客 轉載注明出處
https://junyixie.github.io/2016/12/28/%E8%AF%A6%E8%A7%A3-property/
【iOS 深化了解 @property】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!