iOS中的成員變數,執行個體變數,屬性變數

來源:互聯網
上載者:User

標籤:read   需要   提示   英文   assign   elf   指定   名稱   自己   

在ios第一版中:

  我們為輸出口同時聲明了屬性和底層執行個體變數,那時,屬性是oc語言的一個新的機制,並且要求你必須聲明與之對應的執行個體變數,例如:

  注意:(這個是以前的用法)

@interface MyViewController :UIViewController{    UIButton *myButton;}@property (nonatomic, retain) UIButton *myButton;@end

  在現在iOS版本中:

  蘋果將預設編譯器從GCC轉換為LLVM(low level virtual machine),從此不再需要為屬性聲明執行個體變數了。如果LLVM發現一個沒有匹配執行個體變數的屬性,它將自動建立一個以底線開頭的執行個體變數。因此,在這個版本中,我們不再為輸出口聲明執行個體變數。

  ios5更新之後,蘋果是建議以以下的方式來使用:

@interface MyViewController :UIViewController@property (nonatomic, retain) UIButton *myButton;@end

  因為編譯器會自動為你產生以底線開頭的執行個體變數_myButton,不需要自己手動再去寫執行個體變數。而且也不需要在.m檔案中寫@synthesize myButton,也會自動為你產生setter,getter方法。

  @synthesize的作用:(1)讓編譯器為你自動產生setter與getter方法。(2)可以指定與屬性對應的執行個體變數,例如@synthesize myButton = xxx;那麼self.myButton其實是操作的執行個體變數xxx,而不是_myButton了。

  現在:如果.m檔案中寫了@synthesize myButton,那麼產生的執行個體變數就是myButton;如果沒寫@synthesize myButton,那麼產生的執行個體變數就是_myButton。所以跟以前的用法還是有點細微的區別。

二、執行個體變數與屬性變數使用方法

  在MyViewController.m檔案中,編譯器也會自動的產生一個執行個體變數_myButton。那麼在.m檔案中可以直接的使用_myButton執行個體變數,也可以通過屬性self.myButton.都是一樣的。用self.yourButton來訪問yourButton變數是不對的,Xcode會提示你使用->,改成self->yourButton就可以了。因為OC中點的運算式是表示調用yourButton方法,而上面代碼沒有yourButton方法,也可以直接使用yourButton。

 三、類別中的屬性property

  類與類別中添加的屬性要區分開來,因為類別中只能添加方法,不能添加執行個體變數。經常會在ios的代碼中看到在類別中添加屬性,這種情況下,是不會自動產生執行個體變數的。比如在:UINavigationController.h檔案中會對UIViewController類進行擴充

@interface UIViewController (UINavigationControllerItem)@property(nonatomic,readonly,retain) UINavigationItem *navigationItem;@property(nonatomic) BOOL hidesBottomBarWhenPushed;@property(nonatomic,readonly,retain) UINavigationController *navigationController;@end

  這裡添加的屬性,不會自動產生執行個體變數,這裡添加的屬性其實是添加的getter與setter方法。

  注意一點,匿名類別(匿名擴充)是可以添加執行個體變數的,非匿名類別是不能添加執行個體變數的,只能添加方法,或者屬性(其實也是方法)。

四、成員變數、執行個體變數、屬性變數的聯絡

@interface MyViewController :UIViewControlle
{
UIButton *yourButton;
int count;
id data;
}
@property (nonatomic, strong) UIButton *myButton;
@end

   在{   } 中所聲明的變數都為成員變數。 所以yourButton、count、data都是成員變數。既然如此,執行個體變數又是什麼意思呢?

  執行個體變數本質上就是成員變數,只是執行個體是針對類而言,執行個體是指類的聲明。{   }中的yourButton就是執行個體變數。id 是OC特有的類,本質上講id等同於(void *)。所以id data屬於執行個體變數。

  成員變數用於類內部,無需與外界接觸的變數。因為成員變數不會產生set、get方法,所以外界無法與成員變數接觸。根據成員變數的私人性,為了方便訪問,所以就有了屬性變數。屬性變數的好處就是允許讓其他對象訪問到該變數(因為屬性建立過程中自動產生了set 和get方法)。當然,你可以設定唯讀或者可寫等,設定方法也可自訂。所以,屬性變數是用於與其他對象互動的變數。

  綜上所述可知:成員變數是定義在{}號中的變數,如果變數的資料類型是一個類則稱這個變數為執行個體變數。因為執行個體變數是成員變數的一種特殊情況,所以執行個體變數也是類內部使用的,無需與外部接觸的變數,這個也就是所謂的類私人變數。而屬性變數是用於與其他對象互動的變數。

  但是,現在大家似乎都不怎麼喜歡用成員變數來定義類的變數,都喜歡用屬性變數來定義類的變數。把需要與外部接觸的變數定義在.h檔案中,只在本類中使用的變數定義在.m檔案中。

 

首先來區別一下 執行個體變數、成員變數的區別: 

可以看到在介面 @interface 括弧裡面的統稱為”成員變數”,執行個體變數是成員變數中的一種!執行個體變數的英文翻譯是 Instance Variable (object-specific storage) 執行個體的英文翻譯為Instance(manifestation  of a  class)  說的是“類的表現”,說明執行個體變數應該是由類定義的變數!除去基礎資料型別 (Elementary Data Type)int float ....等,其他類型的變數都叫做執行個體變數。 **執行個體變數+基礎資料型別 (Elementary Data Type)變數=成員變數** 接下來說說 屬性:   在@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檔案{}中添加一個 不可見的 加“_”的成員變數(即使是變數名中本身就帶有“_”)

//括弧裡面定義的都是成員變數(基礎資料型別 (Elementary Data Type)+類產生變數),裡面的變數可以在.m檔案中通過“變數名稱”、self->“變數名稱”直接存取到括弧裡面的變數,但是,這樣的賦值訪問只能是assign,原對象的引用計數器不會發生變化。

//[email protected] 變數名;[email protected] 變數名=_變數名;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效果。

 

 

參考連結:http://www.cnblogs.com/AnnieBabygn/p/5335350.html

iOS中的成員變數,執行個體變數,屬性變數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.