類(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