iOS中屬性及其特質@property、attribute

來源:互聯網
上載者:User

標籤:

屬性:

屬性@property和屬性attribute不同,@property在OC裡有自己的一套專對執行個體變數的處理機制。attribute我們可以特指屬性所具有或遵循的特質。

使用屬性,編譯器就會自動編寫訪問這些屬性所需的方法,此過程叫做“自動合成”(autosynthesis).自動合成的過程是編譯器在編譯期執行。除此之外,編譯器還要自定向類中添加適當類型的執行個體變數,並且在屬性名稱前面加底線,以此作為執行個體變數的名字。也可以用@synthesize 類指定執行個體變數的名字:

如:用@property聲明了一個first的字串變數:

@property (nonatomic,strong) NSString *firstName;

@sybthesize firstName = _myFirstName;//相當於更改了@property裡的執行個體變數的名字_firstName 為 _myFirstName

@dynamic 關鍵字

告訴編譯器:不要自動建立實現屬性所用的執行個體變數,也不要為其建立存取方法。而且,在編譯訪問屬性代碼時,即使編譯器發現沒有定義存取方法,也不會報錯。他相信這些方法在運行時期能找到。

比如,從CoreData架構中的NSManagedObject類裡繼承了一個子類,那麼就需要在運行期動態建立存取方法。因為子類的某屬性不是執行個體變數,其資料來自後端資料庫中。

 

屬性的特質:

@property (nonatomic, readwrite, copy) NSString *firstName;//三個特質

自己定義存取方法的時候,就要遵從與屬性特質相符的原子性。

原子性特質:

atomic:通過鎖定機制來確保其操作的原子性。如果兩個線程同時讀同一屬性,那麼無論何時, 總能看到有效屬性值。

nonatomic:不加鎖,一個線程正在修改屬性值時,另外一個線程也許會突然闖入,把尚未修改好 的屬性值讀取出來。

讀寫權限特質:

readwrite:屬性擁有setter,getter方法,如若該屬性由@synthesize實現,則編譯器會自動產生這 兩個方法。

readonly:屬性僅擁有擷取方法,自由當該屬性由@synthesize實現時,編譯器才會為其合成擷取 方法,你可以用此特質把某個屬性對外公開為唯讀屬性,然後在.m中將其重新定義為讀寫屬性。

記憶體管理語義特質:

assign:只會執行對“純量類型”的簡單賦值操作。

strong:該屬性定義了一種“擁有關係”(owning relationship).為這種屬性設定新值時,設定方法 先保留新值,並且釋放舊值,然後再將新值設定上去。

weak:“非擁有關係”。為這種屬性設定新值時,設定方法即不保留新值,也不釋放舊值。屬性所致的對象在銷毀時,屬性值也會被清空。

unsafe_unretained:與assign類似。但它只適用於“物件類型”,“非擁有關係”。當目標對象銷毀時,屬性值不會自動清空(所以說是不安全的,unsafe),這一點與weak 不同。

copy:設定方法不保留新值,而將其拷貝“copy”.當屬性類型為NSString* 時,經常用此特質來保護其封裝性。因為傳遞給設定方法的新值有可能指向一個樣NSMutableString類的執行個體。這個類是NSString的子類,表示可以修改其值得字串。此時若是不拷貝字串,那麼設定完屬性之後,字串的值就可能會在對象不知情的情況下遭人更改。所以這是就要拷貝一份“不可變”(immutable)得字串。確保對象中的字串值不會無意間變動。

方法名語義特質:

getter=<name>:指定“擷取方法”的方法名。如果屬性是Boolean型的,就可以給擷取該屬性的getter方法改名為isOn之類的。

setter=<name>: 一般不用。

 

一些複雜的屬性要使用懶載入來初始化:

1、懶載入,如果使用了懶載入技術,必須通過存取方法來訪問屬性。懶載入的屬性一般是比較複雜的屬性。如自訂的屬性,數組屬性,字典屬性等。

2、在初始化方法和dealloc方法裡,總是應該直接通過執行個體變數來讀寫資料。

3、在對象內部讀取資料時,應該直接通過執行個體變數來讀,而寫入資料,應該通過屬性來寫。

 

 

iOS中屬性及其特質@property、attribute

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.