OC中@property的幾種屬性

分類:IT技術 時間:2016-10-19
在前面的學習中,出現的(nonatomic,copy)可能給初學者帶來了很大的困惑,為什麽要對屬性進行多方面的設置,這樣寫有什麽好處?下面我們來了解一下。

首先要說明的是,在@property對類中屬性進行聲明時,我們通常會對所聲明的屬性進行一些設置,例如:nonatomic、copy、strong、assign、weak、readwrite
、readonly等。

如果@property後不對屬性進行設置,該屬性同樣有它的默認的一些設置。下面向大家介紹一下幾種屬性的用法以及默認的情況:

nonatomic:原名:非原子性,它涉及到多線程的相關知識。在這裏我們只需要知道有nonatomic聲明的屬性,任何人任何地點任何時間都可以調用它,所以它的缺點就是不安全,而優點就是效率高,訪問速度快。

atomic(默認):原子性。和nonatomic正好相反,他對屬性的訪問進行了限制,保護了聲明屬性的安全,缺點就是:訪問效率低,速度慢。

copy:一般使用於字符串,它的特點如同它的中文翻譯,對屬性進行內容的賦值,將內容另外拷貝一份,保存在一個單獨的存儲空間中。

strong:叫做:強引用。weak:弱引用

為了區分strong和weak以及copy之間的關系,我們來舉一個生活中的例子:我們應該都放過風箏(如果不知道什麽是風箏,你的童年太悲慘了),在放風箏的時候我們手中必須有一根線牽引著風箏。

strong就代表你手中的線(一支風箏上可能有很多根線,也就是說可能有多個strong聲明的屬性用的同一塊內存空間),只要還有一個人牽著風箏,風箏就不回飛走,用OC的話來說就是,只要還有一個用strong聲明的屬性不被銷毀,納悶這塊內存中的數據就不回丟失,該內存空間就不回釋放。

而對於weak來說,就相當於旁邊看放風箏的人,他們只能用手指著你手裏的風箏,大喊著“風箏風箏”,他們只能和你一起欣賞風箏,而對於是不是繼續放風箏的決定權在你,如果你不在放風箏了,那他們也只能“各回各家,各找各媽”。用OC的語言來表達,就是說用weak聲明的屬性雖然可以也可以訪問內存,但是要在這塊內存沒有釋放之前,一旦這塊內存被釋放之後,weak聲明的屬性將失去作用。

對於copy來說,是最幸福的一件事了,雖然你放著風箏被我看見了,我也想放,而且我也不差錢,我就買了一支一模一樣的風箏和你一起放。你收起風箏不放了,我還可以放,有錢就是這麽任性。從OC的角度解釋copy,就是說帶有copy聲明的屬性當指向一塊內存空間時,它會完整的拷貝一份,然後用他自己的那一份,和被拷貝的內存空間沒關系。

assign我認為是其中最簡單的,它應用於OC的基礎數據類型和C語言中的基本數據類型(int,float,double,char)

readwrite:是一種默認屬性,它代表這個屬性即可以讀,也可以寫(這個屬性既有set方法,又有get方法)

readonly:和readwrite不同,它代表這個屬性只能讀,不能進行寫操作(只有get方法,沒有set方法)

getter=<#method#>:在聲明的這個屬性可讀的前提下,使用這個設置可以更改屬性的get方法名,自己起一個。
setter=<#method#>:同get方法類似,在聲明的屬性可寫的前提下,使用這個設置可以設定這個屬性的set方法。

在@property的屬性中,以上幾個屬性用處最多,實際開發過程中基本上都能囊括。

對於以上的幾個屬性,如果你覺的自己雖然知道它的功能是什麽,但是具體使用過程中總是很矛盾到底用哪個,下面幫大家總結一下:

對於基本數據類型,例如int,double,float,char,還有OC語言中的BOOL以及NSInteger來說,都用assign。

對於OC中特有的字符串類型(NSString)來說,最常用的是copy。

對於OC中大量的類對象,一般用strong。

在後面我們會提到協議,在涉及到協議中的delegate時,我們會用weak。

對於前面提到的默認屬性,可以不寫,但是如果不是默認屬性,就要寫明你的意圖。

對於原子性和非原子性,如果不涉及到線程的情況下,為了運行效率的提高,一般寫上非原子性。

在默認情況下,由於每個屬性都是可讀可寫的,所以我們自已自定義屬性的set和get方法。

在某些特殊情況下,如果該屬性已經設置為可讀了,那就不要在用getter這個屬性,因為聲明了也用不了,而且Xcode會給你提示,set也是一樣。
Tags: 中文翻譯 property 初學者 多線程 字符串

文章來源:


ads
ads

相關文章
ads

相關文章

ad