成員變量、實例變量、屬性之間的關系

成員變量、實例變量、屬性之間的關系

首先來區別一下 實例變量、成員變量的區別:

【iOS開發日記-2014.6.20】成員變量、實例變量、屬性之間的關系

可以看到在接口 @interface 括號里面的統稱為”成員變量”,實例變量是成員變量中的一種!

實例變量的英文翻譯是 Instance Variable (object-specific

storage)

實例的英文翻譯為Instance(manifestation

of a

class)

說的是“類的表現”,說明實例變量應該是由類定義的變量!

除去基本數據類型int float ....等,其他類型的變量都叫做實例變量。

**實例變量+基本數據類型變量=成員變量**

接下來說說 屬性:

在@property(描述1 , 描述2 , 描述3)(class *) varName 里面,有3個描述詞需要填寫(也可以不填寫取默認值)

1. nonatomic<-->atomic

2. readwrite<-->readonly

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效果。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容