你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 深化了解 @property

iOS 深化了解 @property

編輯:IOS開發綜合

@property 的實質是什麼?

@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?
- 編譯期

@synthesize @synthesize語法來指定實例變量的名字.
@implementation Person
@synthesize firstName = _myFirstName;
@synthesize lastName = _myLastName;
@end
反編譯做了什麼 OBJC_IVAR_類名屬性稱號 :該屬性的“偏移量” (offset),這個偏移量是“硬編碼” (hardcode),表示該變量間隔寄存對象的內存區域的起始地址有多遠。 setter 與 getter 辦法對應的完成函數 ivar_list :成員變量列表 method_list :辦法列表 prop_list :屬性列表
也就是說我們每次在添加一個屬性,零碎都會在 ivar_list 中添加一個成員變量的描繪,在 method_list 中添加 setter 與 getter 辦法的描繪,在屬性列表中添加一個屬性的描繪,然後計算該屬性在對象中的偏移量,然後給出 setter 與 getter 辦法對應的完成,在 setter 辦法中從偏移量的地位開端賦值,在 getter 辦法中從偏移量開端取值,為了可以讀取正確字節數,零碎對象偏移量的指針類型停止了類型強轉. 默許狀況 對應根本數據類型默許關鍵字是 atomic,readwrite,assign 關於普通的 Objective-C 對象 atomic,readwrite,strong @property 原子性— nonatomic 特質 讀/寫權限—readwrite(讀寫)、readonly (只讀) 內存管理語義—assign、strong、 weak、unsafe_unretained、copy 辦法名—getter= 、setter=
eg:@property (nonatomic, getter=isAllow) BOOL allow; 運用atomic一定是線程平安的嗎?

不是的
- atomic原子操作,零碎會為setter辦法加鎖。(但是也不平安,需求更深層次的鎖定)
- nonatomic不會為setter辦法加鎖。
- atomic:非線程平安,還是需求耗費少量零碎資源來為屬性加鎖
- nonatomic:非線程平安,合適內存較小的挪動設備

援用計數內存管理的考慮方式: 自己生成的對象,自己所持有。 非自己生成的對象,自己也能持有。 自己持有的對象不再需求時釋放。 非自己持有的對象無法釋放。 strong

在ARC下,實例變量自身是強援用,當ARC將傳入值賦給實例變量時,它會保存傳入的值,釋放現有
實例變量的值。非ARC下,setter辦法會保存傳入的值和釋放現有實例變量的值。strong,retain
是同義詞。

copy

假如是不可變的值,行為與strong相反。
假如是可變的值,會將一個正本賦給實例變量。當一個不可變類有一個可變的子類時
(NSString NSMutableString,NSArray NSMutableArray)可以避免setter 辦法傳遞一個
可變的子類的對象。會招致我們在不知情的狀況下修正對象的值。

weak 帶__weak 修飾符的變量不持有對象,所以在超出其變量作用域時,對象被釋放。
可以這樣了解,__weak修飾的變量沒有對象的一切權,不添加對象的援用計數。 什麼狀況運用 weak 關鍵字?

在 ARC 中,在有能夠呈現循環援用的時分,往往要經過讓其中一端運用 weak 來處理,
比方: delegate 代理屬性

本身曾經對它停止一次強援用,沒有必要再強援用一次,此時也會運用 weak,
自定義 IBOutlet 控件屬性普通也運用 weak;當然,也可以運用strong。

assign 適用於值類型。而weak必需用於對象。
assign適用於根本數據類型,weak是適用於NSObject對象,並且是一個弱援用。
assign其實也可以用來修飾對象,那麼我們為什麼不必它呢?由於被assign修飾的對象在釋放之後,指針的地址還是存在的,也就是說指針並沒有被置為nil。假如在後續的內存分配中,剛好分到了這塊地址,順序就會解體掉。
而weak修飾的對象在釋放之後,指針地址會被置為nil。所以如今普通弱援用就是用weak。 @synthesize和@dynamic

@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 辦法異樣會招致解體。編譯時沒問題,運轉時才執行相應的辦法,這就是所謂的靜態綁定。

@synthesize 分解實例變量的規則,有以下幾點: 假如指定了成員變量的稱號,會生成一個指定的稱號的成員變量, 假如這個成員曾經存在了就不再生成了. 假如是 @synthesize xjy; 還會生成一個稱號為xjy的成員變量,也就是說:假如沒有指定成員變量的稱號會自動生成一個屬性同名的成員變量, 假如是 @synthesize xjy = _xjy; 就不會生成成員變量了. 什麼時分不會自動分解 同時重寫了 setter 和 getter 時 重寫了只讀屬性的 getter 時 運用了 @dynamic 時 在@protocol中定義的一切屬性 在category中定義的一切屬性 重載的屬性 (子類中重載父類的屬性)
@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】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved