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

2021-06-28 10:16:59 字數 2565 閱讀 5763

首先來區別一下

例項變數、成員變數

的區別:

可以看到在介面 @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方法對成員變數進行操作。這樣對外界來說,只有...