首先來區別一下
例項變數、成員變數
的區別:
可以看到在介面 @inte***ce 括號裡面的統稱為」成員變數」,例項變數是成員變數中的一種!
例項變數的英文翻譯是 instance
variable
(object
-specificstorage)
例項的英文翻譯為
instance
(manifestation
of a
class
) 說的是「類的表現」,說明例項變數應該是
由類定義的變數!
除去基本資料型別int float ....等,其他型別的變數都叫做例項變數。
**例項變數+基本資料型別變數=成員變數**
接下來說說
屬性:
在
@property(描述1 , 描述2 , 描述3)(class *) varname
裡面,有3個描述詞需要填寫(也可以不填寫取預設值)
1. nonatomicatomic
2. readwritereadonly
3. retain/copy/assign
首先來介紹一下:
retain:他指的是將某個記憶體區域的指標賦值給變數,同時把該記憶體區域的引用計數器加1.每執行一次,該記憶體區域的引用計數器就要加1,當該區域的引用計數器變為0的時候記憶體區域被釋放!
copy:它指的是將目標記憶體區域的值複製乙份,然後開闢新的記憶體區域(新的指標)貼上這個值。同時變數被賦值為新記憶體區域的指標!
assign
:它指的是,僅只把目標記憶體區域的指標賦值給變數,該記憶體區域的引用計數器不發生變化!
1、2兩點不做解釋,3中的retain、copy、assign都是指的,在自動生成setter函式的時候,編譯器需要識別個描述詞來生成對應的setter函式!需要注意的是,如果沒有加上該類的描述詞,系統預設該變數的setter方法採取assign的方式。
在標頭檔案中.h一般在{}裡面會有定義的例項變數
示例:.h
@property (automic,retain) nsstring * abc;
.m@sythesize abc;
//在寫了@sythesize abc;的情況下,系統
不會自動生成例項變數「_
abc」,直接通過變數名abc
,也就是直接使用變數名在賦值運算的時候(=號左邊),只是將記憶體區域的指標賦值給變數,相當於assgin. 如果是通過「點語句」self.abc= 來賦值,就要看在@property中定義的是copy、retain、assign哪一種了,如果沒有加上上述描述詞,就
預設為assign。
//如果沒有寫@sythesize abc; 系統會預設自動在.h檔案{}中新增乙個 不可見的 加「_」的成員變數(即使是變數名中本身就帶有「_」)
//括號裡面定義的都是成員變數(基本資料型別+類生成變數),
裡面的變數可以在.m檔案中通過「變數名稱」、self->「變數名稱」直接訪問到括號裡面的變數,但是,這樣的賦值訪問只能是assign,原物件的引用計數器不會發生變化。
//1.@sythesize 變數名;2.@sythesize 變數名=_變數名;3.不寫@sythesize (一下提到的變數名都是指的在標頭檔案中@property 中定義的變數)
1.成員變數,例項變數通過「變數名」或者self->「變數名」直接訪問到,賦值(assign)。self.變數名 實現setter,getter方法。
2.成員變數,例項變數通過「_變數名」或者self->「_變數名」直接訪問到,賦值(assign)。
self.變數名 實現setter,getter方法。
3.成員變數。例項變數(系統自動在原來變數名前加上「_」來生成的例項,成員變數),直接通過self->_變數名,或者變數名直接訪問到(assign)。
self.變數名 實現setter,getter方法。
如果在標頭檔案中沒有通過@property定義的變數,但是在{}中有定義成員變數,在實現檔案中也也沒有@sythesize ,那麼可以直接通過self->「{}中的變數名」,或者直接使用
「{}中的變數名」來訪問賦值,這樣的變數沒有定義setter,getter函式,只能是assign的方式賦值。
//再來分析一下@sythesize中的寫法,@sythesize abc 直接在.m檔案中使用self.abc可以呼叫成員變數的setter、getter函式,直接呼叫成員變數名稱abc就為訪問該變數的指標,對成員變數直接賦值等同於assign效果。
屬性,例項變數和成員變數
synthesize window window 意思是說,window 屬性為 window 例項變數合成訪問器方法。解析 意思是說window屬性生成訪問方法 setwindow方法,而這個方法就是實際變數 window的 的訪問方法,setwindow操作的就是 window這個方法。ps w...
Java中成員變數和屬性之間的關係
有人可能遇到這樣的錯誤,明明在類中定義了某個成員變數,但是系統在執行的時候提示錯誤 屬性xx沒有定義。這是什麼原因呢?大家知道成員變數有多種訪問控制符,通常都應該把成員變數定義成私有的,然後為該成員變數提供set方法和get方法,外界通過set方法和get方法對成員變數進行操作。這樣對外界來說,只有...
Java中成員變數和屬性之間的關係
有人可能遇到這樣的錯誤,明明在類中定義了某個成員變數,但是系統在執行的時候提示錯誤 屬性xx沒有定義。這是什麼原因呢?大家知道成員變數有多種訪問控制符,通常都應該把成員變數定義成私有的,然後為該成員變數提供set方法和get方法,外界通過set方法和get方法對成員變數進行操作。這樣對外界來說,只有...