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学习笔记有详细解析.)