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

浅析Objective-C中的Protocol协议

2015-07-23 17:04 597 查看
在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个

类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。这个里面

可以声明一些方法,和java不同的是,它可以声明一些必须实现的方法和选择实现的方法。这个和java是完全不同的。

下面我们就用一个例子来说明这个吧。

首先是MyProtocol.h也就是接口的声明文件

[cpp] view
plaincopyprint?

//

// MyProtocol.h

// Protocol

//

// Created by bird on 12-10-22.

// Copyright (c) 2012年 bird. All rights reserved.

//

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>

@optional

//这个方法是可选的

- (void) print:(int) value;

@required

//这个方法是必须实现的

- (int) printValue:(int) value1 andValue:(int) value2;

@end

然后是Mytest.h也就是类的声明文件,这个类讲实现这个接口

[cpp] view
plaincopyprint?

//

// MyTest.h

// Protocol

//

// Created by bird on 12-10-22.

// Copyright (c) 2012年 bird. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "MyProtocol.h"

@interface MyTest : NSObject <MyProtocol>

- (void) showInfo;

@end

下面就是实现文件了

[cpp] view
plaincopyprint?

//

// MyTest.m

// Protocol

//

// Created by bird on 12-10-22.

// Copyright (c) 2012年 bird. All rights reserved.

//

#import "MyTest.h"

@implementation MyTest

- (void) showInfo

{

NSLog(@"show info is calling");

}

- (int) printValue:(int)value1 andValue:(int)value2

{

NSLog(@"print info that value1 is %d and value2 is %d",value1,value2);

return 0;

}

//下面的这个方法可以实现也可以不实现

- (void) print:(int)value

{

NSLog(@"print is value is %d",value);

}

@end

这样我们就可以看出了,这个类实现了接口也就是协议的声明的方法,然后还定义了自己的类方法。

下面我们来看一下主函数来使用这个接口,我将分别使用两种方式来使用这个类,一个是基本的方法就是使用类的创

建来调用,另一个就是使用接口来调用

[cpp] view
plaincopyprint?

//

// main.m

// Protocol

//

// Created by bird on 12-10-18.

// Copyright (c) 2012年 bird. All rights reserved.

//

#import <Foundation/Foundation.h>

#import "MyTest.h"

#import "MyProtocol.h"

int main(int argc, const char * argv[])

{

@autoreleasepool {

//这里是普通的类的调用方法

MyTest * myTest = [[MyTest alloc] init];

[myTest showInfo];

SEL sel = @selector(print:);//这个print转换成的方法

//确定这个print方法是否实现

if([myTest respondsToSelector:sel]){

[myTest print:20];

}

[myTest printValue:25 andValue:15];

[myTest release];

//下面的方法使用协议的方式来调用

id<MyProtocol> myProtocol = [[MyTest alloc] init];

if([myProtocol respondsToSelector:@selector(print:)]){

[myProtocol print:210];

}

[myProtocol release];

}

return 0;

}

[cpp] view
plaincopyprint?

[myProtocol respondsToSelector:@selector(print:)]

这句话的用处就是测试是否这个类实现了这个方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: