1 id類型
id類型是一種通用的對象類型,id可以用來存儲什麼類型的對象。類似Java的Object。
2 動態綁定
動態綁定也叫多態,是在程序運行期間,根據對象的實際類型進行相應的調用。
#import <Foundation/Foundation.h>
#import "Dog.h"
#import "Cat.h"
int main(){
@autoreleasepool{
id animal;
Dog *dog = [[Dog alloc] init];
Cat *cat = [[Cat alloc] init];
animal = dog;
[animal bark]; //[dog bark];
id = cat;
[animal bark]; //[cat bark];
}
}
上面有兩個類型,Dog和Cat,這兩個類型都有一個bark方法,狗和貓的叫聲不同,方法實現不同。
id類型可以指向任何對象,所以id可以表示Dog和Cat,id類型會跟蹤對象的實際類型,運行的時候,id會先判斷對象的實際類型,然後再進行調用。而不是編譯期間。
所以當id指向dog時,調用的是dog的bark方法,指向cat時,調用cat的方法。
3編譯時和運行時檢查
因爲id類型是在運行時進行判斷是什麼對象,所以很多錯誤會在運行時發生。如下:
animal = dog;
[animal dance];
這裏的dog並沒有dance方法,但是id類型運行時纔會檢查,所以編譯器不會檢查,這裏會產生找不到方法錯誤,unrecognized selector to instance
4 類的檢查
class: 要獲取class對象可以使用class方法。
[Dog class];
[dog class] //dog爲類Dog的對象。
if( [obj1 class]==[obj2 class] ) //判斷是否是相同的類實例
[ dog isMemberOfClass: [Dog class] ]; //判斷dog是否是Dog的成員
selector: @selector( alloc );
SEL sel = @selector ( setNum: );
SEL sel = @selector ( setName: andAge: );
[Dog instancesRespondToSelector: @selector ( setName: andAge: )]; //包含繼承的方法
5 異常處理
異常處理跟Java很類似,使用@try{}@catch( NSException *exception ){}塊。
如果try塊內的代碼拋出異常,執行不會終止,而是立即跳到@catch塊中,在那裏繼續執行。
在@catch塊中可以處理異常。
@finally和@throw方法的使用跟Java一樣。