Object-C 學習筆記(十一)---動態綁定&異常處理

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學習筆記有詳細解析.)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章