您的位置:首页 > 移动开发 > Objective-C

Object-C 学习笔记(十一)---动态绑定&异常处理

2013-12-11 15:01 399 查看
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学习笔记有详细解析.)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: