IOS開發中 類、對象、執行個體變數、成員變數、屬性變數等區別和關係__IOS

來源:互聯網
上載者:User

  類(class):具有相同屬性和行為等同一類元素等總稱,類是一個抽象的概念。

區分是類還是對象,看它能否繼續被細分。

在OC中,類是表示物件類型的結構體,對象通過類來擷取自身的各種資訊。類由兩個部分組成:*.h和*.m檔案組成。

*.m檔案中 implemention部分是類的實現部分,內部包含類中的各種資訊,包括各種執行個體方法或類方法。


類別( category):是為現有的類添加新方法的方式,通常以“類名稱+類別名稱”來命名。

類別中不能添加新的執行個體變數。但是可以在類別中添加屬性。

類別在業務開發中的主要用途是:在不改變原始碼原類內容的情況下,為類添加新的方法。


類擴充(class extension):類擴充是分類的一種特殊形式,擴充是沒有名字的分類。檔案嗎通常是:“主類類名_擴充標識.h”

擴充通常定義的檔案的.m中,不能分開。擴充中可以聲明執行個體變數、屬性、方法,但是全部都是私人方法。


對象(object):是不可細分,代表著某一個具體的東西的。

在OC中,對象是一種包含值和指向其類的隱藏指標的結構體。

通過將類執行個體化變為對象。

執行個體化的方法有alloc,new,copy,Factory 方法,單例方法等


執行個體變數(instance variable):由類定義的執行個體話的變數(不包括基礎資料型別 (Elementary Data Type),如int,double,float)。


成員變數(Member variable):代碼中的變數,包含執行個體變數和基本變數類型,無需與外界接觸。

成員變數預設是protected,一般情況下,非子類對象無法訪問.


屬性(property):編譯器自動將變數的set和get方法的合成,可用點文法讀取,可作為變數使用,可與外界接觸。


來區別一下執行個體變數、成員變數的區別:
可以看到在介面 @interface 括弧裡面的統稱為”成員變數”,執行個體變數是成員變數中的一種。 執行個體變數的英文翻譯是 Instance Variable (object-specificstorage)  執行個體的英文翻譯為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,原對象的引用計數器不會發生變化。

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



整理及轉載自 

http://blog.sina.com.cn/s/blog_75830d770101g560.html





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.