IOS之@property 的理解
@synthesize合成實例變量的規則是什么? @synthesize表示由編譯器來自動實現屬性的getter/setter方法,不需要你自己再手動去實現。默認情況下,不需要指定實例變量的名稱,編譯器會自動生成一個屬性名前加“_”的實例變量。當然也可以在實現代碼里通過@synthesize語法來指定實例變量的名字。
@synthesize和@dynamic分別有什么作用?
簡單來講,通過@synthesize指令告訴編譯器在編譯期間產生getter和setter方法。如果自定義getter和setter方法則會覆蓋編譯器幫我們生成的方法。
@dynamic指令告訴編譯器在編譯期間不自動生成getter和setter方法,避免編譯期間產生警告。然后由自己實現存取方法或存取方法在運行時動態創建綁定。其主要作用就是用在NSManageObject對象的屬性聲明中,由于此類對象的屬性一般是從Core Data的屬性中生成的,Core Data框架會在程序運行的時候為此類屬性生成getter和setter方法。
atomic:默認是有該屬性的,這個屬性是為了保證程序在多線程情況下,編譯器會自動生成一些互斥加鎖代碼,避免該變量的讀寫不同步的問題,提供多線程安全。
nonatomic:如果該對象無需考慮多線程的情況,請加入這個屬性,這樣會讓編譯器少生成一些互斥加鎖代碼,禁止多線程,變量保護,提高性能和效率。
注:
atomic是Objc使用的一種線程保護技術,基本上來講是防止在寫未完成的時候另一個線程讀取,造成的數據錯誤。而這種機制是非常耗費系統資源的,所以iPhone這種小型設備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。而iOS開發中,普遍使用nonatomic也是基于性能這一點。 weak屬性需要在dealloc中置nil么? 不用。系統會自動幫你管理。注意循環引用的出現,和無法被銷毀的對象的處理就好。
@property 的本質是什么?
? @property = ivar + getter + setter;
“屬性” (property)有兩大概念:ivar(實例變量)、存取方法(access method = getter + setter)。
“屬性” (property)作為 Objective-C 的一項特性,主要的作用就在于封裝對象中的數據。 Objective-C 對象通常會把其所需要的數據保存為各種實例變量。實例變量一般通過“存取方法”(access method)來訪問。其中,“獲取方法” (getter)用于讀取變量值,而“設置方法” (setter)用于寫入變量值。這個概念已經定型,并且經由“屬性”這一特性而成為Objective-C 2.0的一部分。 而在正規的 Objective-C 編碼風格中,存取方法有著嚴格的命名規范。 正因為有了這種嚴格的命名規范,所以 Objective-C 這門語言才能根據名稱自動創建出存取方法。其實也可以把屬性當做一種關鍵字,其表示:
?
ARC下,不顯示指定任何屬性關鍵字時,默認的關鍵字都有哪些?
-
對應基本數據類型默認關鍵字是
atomic,readwrite,assign
-
對于普通的OC對象
atomic,readwrite,strong
?
@synthesize和@dynamic分別有什么作用?
?
1)@property有兩個對應的詞,一個是@synthesize,一個是@dynamic。如果@synthesize和@dynamic都沒寫,那么默認的就是@syntheszie var = _var;
?
2)@synthesize的語義是如果你沒有手動實現setter方法和getter方法,那么編譯器會自動為你加上這兩個方法。
?
3)@dynamic告訴編譯器:屬性的setter與getter方法由用戶自己實現,不自動生成。(當然對于readonly的屬性只需提供getter即可)。假如一個屬性被聲明為@dynamic var,然后你沒有提供@setter方法和@getter方法,編譯的時候沒問題,但是當程序運行到instance.var = someVar,由于缺setter方法會導致程序崩潰;或者當運行到 someVar = var時,由于缺getter方法同樣會導致崩潰。編譯時沒問題,運行時才執行相應的方法,這就是所謂的動態綁定。
?
?
在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景?
回答這個問題前,我們要搞清楚一個問題,什么情況下不會autosynthesis(自動合成)?
-
同時重寫了setter和getter時
-
重寫了只讀屬性的getter時
-
使用了@dynamic時
-
在 @protocol 中定義的所有屬性
-
在 category 中定義的所有屬性
-
重載的屬性
當你在子類中重載了父類中的屬性,你必須 使用@synthesize來手動合成ivar。
除了后三條,對其他幾個我們可以總結出一個規律:當你想手動管理@property的所有內容時,你就會嘗試通過實現@property的所有“存取方法”(the accessor methods)或者使用@dynamic來達到這個目的,這時編譯器就會認為你打算手動管理@property,于是編譯器就禁用了autosynthesis(自動合成)。
?
?
?
?
轉載于:https://www.cnblogs.com/Biaoac/p/5288350.html
總結
以上是生活随笔為你收集整理的IOS之@property 的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基于ROW格式的数据恢复
- 下一篇: 《Linux内核设计与实现》课程学习重点