OC Note

1. .h ->@property int x,y; .m->不使用 @synthesize,生成的setter和getter是_x, _y. 使用@syntherisze x,y; 生成的setter和getter都是x, y;編程

2. .h -> 多參數函數: -(void) setX: (int)x y:(int) y; .m -> -(void) setX: (int)x y:(int)y{...}函數

3. 調用new class, newClass * test = [[newClass alloc] init];測試

  [test setX: 3 y: 5];spa

4.  static 關鍵字: 在變量聲明前加上關鍵字static,可使局部變量保留屢次調用一個方法所得的值。代理

  只能在定義靜態變量和局部變量的方法中訪問這些變量。能夠將變量的聲明移到全部方法聲明的外部(一般放在implementation文件的開始處),這樣全部的方法都能狗訪問它們。code

 

5. OC中通常用 來調用實例的屬性,方法仍是用[classInstance function].對象

繼承

1. @class指令blog

  例: @class XYPoint; 由於編譯器在遇到實例變量XYPoint時,必須瞭解XYPoint是什麼。另外一條選擇是能夠導入頭文件替代這條指令,語句以下:#import "XYPoint.h". 使用@class 指令提升了效率,由於編譯器不須要引入和處理整個XYPoint.h 文件,只須要知道XYPoint 是一個類名。若是須要引用XYPoint 類的方法(在實現部分中),@class 指令是不夠的,由於編譯器須要更多的消息。它須要清楚方法有多少參數、它們是什麼類型、方法的返回類型是什麼。繼承

2.  抽象類,定義方法和實例變量,但不指望從這個類建立實例(沒有實現方法)。接口

多態、動態類型和動態綁定

多態:不一樣類能夠定義相同的方法。

動態類型:id:能夠存儲任何類的對象。id dataValue;

動態綁定:先斷定對象所屬的類,而後在運行時肯定動態調用的方法,而不是在編譯的時候。

  className * test = [[className alloc] init];

  id dataValue = test; //動態綁定,知道dataValue的類

  id dataValue = [[className alloc] init];

  [dataValue setX:1 overY:2]; //這是在運行的時候才調用setX: overY: 方法,由於不知道dataValue的類。

 異常

@try {

}
@catch (NSException *exception) {
    
}
@finally {
    
}

@throw 拋出異常。

通常來講,你並不但願程序在運行時發生異常。這就須要考慮更好的編程實踐,在錯誤發生以前作測試,而不是錯誤發生以後捕獲它。測試方法的錯誤並返回一些值做爲錯誤的標識,而不是拋出異常。拋出異常一般會使用大量的系統資源,Apple反對非必要的使用異常(例如,你不但願由於一個文件沒法打開而拋出異常)。

 

常見的編程習慣是類中的全部的初始化方法都是以 init 開頭。

重載 init 方法:

- (instancetype) init

{
  self = [super init];
  if (self){
    //初始化代碼
  }
  return self;
}

這個方法首先會調用父類的初始化方法。執行父類的初始化方法,使得繼承的實例變量可以正常的初始化。必須將父類的 init 的執行結果賦給 self, 由於初始化過程改變了對象在內存中的位置(意味着引用將要改變)。

若是父類的初始化過程成功,返回的值將是非空的,經過if語句能夠驗證。註釋說明能夠在這個代碼塊的位置放入自定義的初始化代碼。一般能夠在這個位置建立並初始化實例變量。

extern引用外部變量:

類1: int gGlobalVar = 100; //定義全局變量,需定義在該類的實現文件中

類2: extern int gGlocalVar; //在另外一個類中引用gGlobalVar.

若是有不少方法須要訪問gGlobalVar的值,只在文件的開始進行一次extern聲明比較簡便。可是,若是隻有一個或少數幾個方法要訪問這個變量,就應該在其中的每一個方法中單獨進行extern聲明。這樣程序的組織結構更加清晰,而且實際使用到的不一樣函數能夠單獨使用這個變量。

 協議

@Protocol

定義: 協議是多個類共享的一個方法列表。協議中列出的方法沒有相應的實現,計劃有其餘人來實現。協議提供了一種方式,用指定的名稱定義一組多少有點相關的方法。這些方法一般有文檔說明,因此你知道他們將如何執行。所以,若是須要,可在本身的類定義中實現他們。

在.h中定義,

@Protocol NSCoding
-(void) copyWithZone: (NSZone *) zone;
@end

使用: 若是你定義的類要使用NSCoding協議, <..協議..>,那就須要AddressBook類中實現copyWithZone方法。

@interface AddressBook:NSObject <NSCoding, NSCopying>
- (void) PrintV;
@end

若是不想別人看到你的類遵循哪些協議,那就寫到.m文件中

@interface ProfilePreviewContoller () <NSCoding>
...
@end

代理

協議也是一種兩個類之間的接口定義。定義了協議的類能夠看做是將協議定義的方法代理給了實現他們的類。這樣,類的定義能夠更爲通用,由於具體的動做由代理類來承擔,響應某些事件或者定義某些參數。

相關文章
相關標籤/搜索