屬性,例項變數和成員變數

2021-06-28 02:16:55 字數 2777 閱讀 5221

@synthesize window=_window;   意思是說,window 屬性為 _window 例項變數合成訪問器方法。

解析: 

意思是說window屬性生成訪問方法 :setwindow方法,而這個方法就是實際變數 _window的 的訪問方法,setwindow操作的就是_window這個方法。

ps:window是屬性,而_window是實際的變數。

注意:通過這個看似是賦值的這樣乙個操作,我們可以在@synthesize 中定義與變數名不相同的getter和setter的命名,籍此來保護變數不會被不恰當的訪問。

那麼屬性、例項變數和成員變數的區別是什麼?

(1)例項變數和成員變數

由上圖看出,@inte***ce括號中間統稱為「成員變數」,例項變數是由類定義的變數,是成員變數的一種。

嚴格說來, 上圖中的  int  count;  是乙個成員變數。  而 nsstring * name;  是乙個例項變數。
(2)屬性

屬性的宣告如下:

@proterty(修飾詞)類名 *屬性名,中有修飾詞要填寫(也可以不填寫取預設值),包括:

訪問器方法名

預設與屬性相關的getter 和 setter 方法是這樣的形式: 

propertyname 

setpropertyname 

,例如,有個屬性叫 「foo」, 訪問器則應當是foosetfoo:. 下面的結構則允許我們指定個性化的名字來取代上面的預設形式。它們都是可選的,可以出現在任何其它額外屬性中(除了setter=中的readonly).

getter=gettername指定屬性的get訪問器名。getter 返回值型別必須符合屬性型別並且getter方法中不能有任何引數。

setter=settername指定屬性的 set 訪問器名。setter 方法必須帶有乙個與屬性型別一樣型別的引數,並且返回值型別為void.

假如你指定了乙個屬性為readonly並且用setter=指定了乙個 setter方法, 編譯器就會給出警告。

)—通常我們使用getter修飾器的原因是為了遵循布林值的屬性命名約定.

可寫性

這些額外屬性指定了是否乙個屬性與set訪問器關聯了。這些選項是互斥的。

readwrite知名屬性屬性是 read/write. 預設是這個選項。

getter 跟 setter 方法都要放在@implementation塊中. 要是你在實現塊中使用@synthesize指令,  getter 和 setter 方法則將被整合。

readonly指明屬性是唯讀的。

如果你指定了readonly, 那麼@implementation塊中只需要乙個getter方法. 要是你在實現塊中使用@synthesize指令,  那麼只有 getter 方法會被整合。除此之外,假設你試圖使用逗點語法給乙個唯讀屬性賦值,編譯器將會報錯。

setter 語法

這些額外屬性指明了set訪問器的語法。這些選項是互斥的。

strong指明此屬性跟目標物件有著緊密的(擁有)關係(將某個記憶體區域的指標賦值給變數,同時引用計數+1)。

weak指明與目標物件是鬆散的(非擁有)關係。

假如目標物件被釋放了,屬性值將自動被設為nil.

( os x v10.6 和 ios 4不支援弱屬性; 取而代之的是assign.)

copy指明物件的副本應當用於賦值操作。

訊息.方法被建立. 除了物件型別(實現了nscopying協議),對其它型別這個額外屬性是無效的。

assign指明 setter 使用簡單賦值(引用計數不發生變化)。這個額外屬性是預設選項。

在基本資料型別和c資料型別中你會用到這個額外屬性,例如nsintegercgrect.

retain

訊息。在 os x v10.6 以及更新的版本中,你可以使用__attribute__關鍵字來指定乙個 core foundation 屬性應當被當做乙個用於記憶體管理的 objective-c 物件對待。

@property(retain) __attribute__((nsobject)) cfdictionaryref mydictionary;
原子性

nonatomic指明訪問器是非原子的。預設情況下,訪問器是原子的。

屬性預設是原子的,這種情況下生成的訪問器提供了多執行緒環境下對屬性的安全訪問/訪問互斥互斥,同一時刻,只有乙個執行緒可以訪問屬性。

要是你指定了strong,copy或者retain並且沒有指定nonatomic那麼在乙個引用計數環境中,為屬性生成的get訪問器將使用lock, retain ,自動釋放返回的值,然後才返回結果。

成員變數和屬性

成員變數的作用域 inte ce person nsobject 屬性生成器 屬性生成器 property 1.自動的生成 getter和setter方法的 宣告 2.需要知道 引數型別和屬性名稱 3.是編譯器的特性 synthesize 生成getter 和 setter方法,最為簡單的實現 sy...

成員變數 例項變數 屬性之間的關係

首先來區別一下 例項變數 成員變數 的區別 可以看到在介面 inte ce 括號裡面的統稱為 成員變數 例項變數是成員變數中的一種!例項變數的英文翻譯是 instance variable object specificstorage 例項的英文翻譯為 instance manifestation ...

類的成員變數和例項變數

class classout out mem out mem def init self inner mem inner mem self.inner mem self.inner mem self.inner mem self.inner mem self.out mem self.out mem...