OC時一門面相對象的語言,前面提及到多態是一種動態綁定的技術之一,什麼是動態綁定呢?
動態綁定:在編譯的時候未確定是什麼類型或程序根據正常的語法編譯,在運行時根據多態來確定哪一種數據類型或者是調用哪個方法.
例子:
//
// Car.h//父類
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Bmw.h"
@interface Car : NSObject
{
@public
Bmw *bw;
}
-(void)run:(NSInteger) speed;
-(void)color;
@end
//
// Car.m
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Car.h"
@implementation Car
-(void)run:(NSInteger) speed
{
}
-(void)color
{
}
@end
//
// Audi.h
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Car.h"
@interface Audi : Car
@end
//
// Audi.m
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Audi.h"
@implementation Audi
-(void)run:(NSInteger)speed
{
NSLog(@"奧迪車以%ld的速度在路上跑...",speed);
}
-(void)color
{
NSLog(@"這量奧迪車是黃色的");
}
@end
//
// Bmw.h
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Bmw : NSObject
{
@private
NSString *name;
}
-(void)run:(NSInteger)speed;
-(void)color;
@end
//
// Bmw.m
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import "Bmw.h"
@implementation Bmw
-(void)run:(NSInteger)speed
{
NSLog(@"寶馬車以%ld的速度在路上跑...",speed);
}
-(void)color
{
NSLog(@"這量寶馬車是黃色的");
}
@end
main.m
//
// main.m
// 動態綁定
//
// Created by 5016 on 13-12-11.
// Copyright (c) 2013年 dradon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Car.h"
#import "Audi.h"
#import "Bmw.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Bmw *bmw = [[Bmw alloc] init];
Audi *audi = [[Audi alloc] init];
Car *car =[[Car alloc] init];
//判斷是否是子類
if ([audi isKindOfClass:[Car class]]) {
NSLog(@"audi 是 Car的一種");
}
//判斷是否是類成員
if([audi isMemberOfClass:[Car class]]){
NSLog(@"audi 是 Car的一個成員");
}
if([car isMemberOfClass:[Car class]]){
NSLog(@"car 是 Car的一個成員");
}
//判斷是否能響應方法
//寫法1
if([bmw respondsToSelector:@selector(color)]){
NSLog(@"bmw 能響應color這個方法");
}
//寫法2
SEL action;
action = @selector(run:);
[bmw performSelector:action];
//寫法3
[bmw performSelector:@selector(run:)];
//判斷是否爲子類
if ([Audi isSubclassOfClass:[Car class]]) {
NSLog(@"Audi是Car的子類");
}
//判斷是否爲同一類型
if([Audi class] == [Bmw class]){
NSLog(@"Audi 與 Bmw是同一個類");
}
//異常處理
@try {
[bmw jiayou];//沒有jiayou這個方法
}
@catch (NSException *exception) {
NSLog(@"異常名稱是==>%@,異常原因是===>%@",[exception name],[exception reason]);
}
@finally {
NSLog(@"一定執行的程序,這個方法是私有的");
}
}
return 0;
}
紅色那段是異常處理的代碼,bmw沒有jiayou的方法,但是卻調用了,於是出現異常,如果不被捕捉,則程序崩潰.(異常處理在java學習筆記有詳細解析.)