1. 程式人生 > >OC(一)類、物件、屬性、成員變數、方法(整理)

OC(一)類、物件、屬性、成員變數、方法(整理)

第一節   類、物件 >類(Class):具有相同屬性和行為等同一類元素等總稱,類是一個抽象的概念。 在Java中,類就是同一類事物的統稱,例如:鳥類、人類、魚類等等。 在OC中,類是表示物件型別的結構體,物件通過類來獲取自身的各種資訊,包括各種例項方法或類方法。 >物件/例項(Instance):事物存在的實體,是不可細分的,代表著某一個具體的東西。 在Java中,物件是事物存在的實體。通常將物件劃分為兩個部分:靜態部分【屬性】與動態部分【行為】。 在OC中,物件是一種包含值和只想其類的隱藏指標的結構體。可通過類例項化變為物件(alloc,new,copy,工廠方法,單例方法)等。 >類與物件的關係:
類實質上就是封裝物件屬性和行為的載體,而物件則是類抽象出來的一個例項。類是對世間事物的抽象稱呼,而物件則是這個事物對應的實體。 類——例項化一個——>物件 類的構成 >匯入介面 #import “ItsSuperclass.h" 介面檔案通常包含在#import 指令中  #import與#include 的區別:作用一樣,唯一的區別是這條指令可以確保同一個檔案不會被匯入多次。 @class 與#import的區別: 1、#import方式會包含被引用類的所有資訊,包括被引用類的變數和方法;@class方式只是告訴編譯器在A.h檔案中 B *b 只是類的宣告,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正去檢視B類中資訊;
2、使用@class方式由於只需要只要被引用類(B類)的名稱就可以了,而在實現類由於要用到被引用類中的實體變數和方法,所以需要使用#importl來包含被引用類的標頭檔案; 3、通過上面2點也很容易知道在編譯效率上,如果有上百個標頭檔案都#import了同一 個檔案,或者這些檔案依次被#improt(A->B, B->C,C->D…),一旦最開始的標頭檔案稍有改動,後面引用到這個檔案的所有類都需要重新編譯一遍,這樣的效率也是可想而知的,而相對來 講,使用@class方式就不會出現這種問題了; 4、對於迴圈依賴關係來說,比方A類引用B類,同時B類也引用A類,B類的程式碼:
  1. #import "A.h"  
  2. @interface B : NSObject {   
  3.     A *a;   
  4. }   
  5. @end
當程式執行時,編譯會報錯, 當使用@class在兩個類相互宣告,就不會出現編譯報錯。 >類介面的宣告以@interface開頭以@end結尾。 在其中宣告屬性和方法。 @interface ClassName :ItsSuperclass {      // Instance variable declarations.    // 例項變數的宣告 } // Method and property declarations.  // 方法和屬性的宣告 @end >類的實現  以@implementation開頭,@end結尾 可能會在@implementation後面的大括號中宣告例項變數 @implementation ClassName {      // Instance variable declaration  // 例項變數的宣告
} // Method definitions.   方法的定義 @end 第二節  成員變數、屬性、方法 >成員變數
成員變數(Member variable):上圖中括號裡面的統稱為“成員變數”。 例項變數 (Instance variable):例項變數是成員變數中的一種。即例項變數由類定義的變數,除去基本資料型別int float..等,其他型別的變數都叫例項變數**例項變數+基本資料型別變數=成員變數** 成員變數用於類的內部,無需與外界接觸的變數。因為成員變數不會生成set、get方法,所以外界無法與成員變數接觸。 一般使用的時候為_name,點語法呼叫的就是訪問器方法(set/get).m檔案中,self.name 這樣的表示式是錯誤的。xcode會提示你使用->,改成self->name就可以了。因為oc中點表示式是表示呼叫方法,而上面的程式碼中沒有name這個方法。(set/get方法)  oc語法關於點表示式的說明:"點表示式(.)看起來與C語言中的結構體訪問以及java語言彙總的物件訪問有點類似,其實這是oc的設計人員有意為之。如果點表示式出現在等號 = 左邊,該屬性名稱的setter方法將被呼叫。如果點表示式出現在右邊,該屬性名稱的getter方法將被呼叫。" >屬性變數 @property (描述1,描述2,描述3) (class *)varName;  // 屬性的樣式 描述1: nonatomic <--->  atomic (原子性和非原子性) 描述2:readwrite <—>readonly  (讀寫) 描述3:retain/copy/assign retain: 指的是講某個記憶體區域的指標賦給變數,同時把該記憶體區域的引用計數器加1.每執行一次,該記憶體區域的引用計數器就要加1,當該區域的引用計數器變為0的時候,記憶體被釋放! copy:指的是將目標記憶體區域的值複製一份,然後開闢新的記憶體區域(新的指標)貼上這個值。同時變數被賦值為新記憶體區域的指標! assign:指的是僅把目標記憶體區域的指標賦值給變數,該記憶體區域的引用計數器不發生變化! 這三個都是指的,在自動生成setter函式的時候,編譯器需要識別描述詞來生成對應的setter函式,需要注意的是,如果沒有加上該類的描述詞,系統預設該變數的setter方法採用assign的方式. 因為編譯器會自動為你生成以下劃線開頭的例項變數_myButton,不需要自己手動再去寫例項變數。而且也不需要在.m檔案中寫@synthesize myButton;也會自動為你生成setter,getter方法。@synthesize的作用就是讓編譯器為你自動生成setter與getter方法。 @synthesize 還有一個作用,可以指定與屬性對應的例項變數,例如@synthesize myButton = xxx;那麼self.myButton其實是操作的例項變數xxx,而不是_myButton了。 屬性和變數的區別:屬性變數在建立的過程中自動產生了set和get方法,主要用於與其他物件互動的變數。成員變數則是用於類內部的私有變數,不會生成set、get方法。 >方法 開頭為負號(-)的方法為例項方法,被物件指標呼叫。 開頭為正好(+)的方法表示為類方法,類方法是對類本身執行某些操作的方法。(1.便利構造器 2.單例 3.純過程封裝)        -          (void)      setNumerator           :                  (int)                n; 方法型別    返回型別        方法名稱        方法有引數      引數型別     引數名稱