• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Objective-C学习之旅(七)----协议protocol

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

一、什么是协议

  1、协议是多个对象之间协商的一个接口对象

  2、协议提供一系列方法用来在协议的实现者和代理者之间的一种通信方式

  3、协议类似于C++中的纯虚函数,或者java/.net中的接口

二、如何定义协议

  1、协议声明,就放在.h文件中,不像类的定义,声明放在.h文件中,实现放在.m文件中。

  @protocol MyProtocol<NSObject>

    //要定义的变量

    - (void) init;

    -(int) update:(int)time;

  @end

  2、Protocol声明一系列方法,这些放在实现Protocol中实现

  3、协议方法可以实现optional,可选实现,就是说标有@optional的是可选实现的,默认的也是可选实现的。标有@required的是必须实现的。这一点和java/.net就不同了,java/.net中实现了接口的类中的方法必须全部实现。

  4、协议需要继承与基协议NSObject

  5、协议可以多继承

三、如何使用协议

  O-C中判断某个对象是否相应方法

  1、既然接口可以部分实现,OC对象提供了动态判断某个方法是否实现的方法

  2、respondsToSelector

  if([test respondsToSelector:@selector(showInfo)]){

  [test showInfo];

  }

四、代码实例:

定义一个协议:MyProtocol.h

View Code
#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>

@optional
- (void) print:(int)value;
// print: 是可选的

@required
- (int) printValue:(int)value1 andValue:(int)value2;
// printValue:andValue: 这个方法是必须要实现的

@end

定义一个MyTest的类
MyTest.h

View Code
#import <Foundation/Foundation.h>
#import "MyProtocol.h"

@interface MyTest : NSObject <MyProtocol>

- (void) showInfo;

@end

MyTest.m

View Code
#import "MyTest.h"

@implementation MyTest

- (void) showInfo
{
    NSLog(@"show info is calling");
}
// 下面这2个方法是来源于 MyProtocol协议
- (int) printValue:(int)value1 andValue:(int)value2
{
    NSLog(@"print value value1 %d value2 %d",
          value1, value2);
    return 0;
}

- (void) print:(int)value
{
    NSLog(@"print value %d", value);
}

@end

main.m

View Code
#import <Foundation/Foundation.h>
#import "MyTest.h"
#import "MyProtocol.h"

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        MyTest *myTest = [[MyTest alloc] init];
        [myTest showInfo];
        SEL sel = @selector(print:);
        // 这个pirnt: 转化成 SEL类型的 方法
        if ( [myTest respondsToSelector:sel] ) {
            // 判断 myTest是否 响应 sel方法 (print:)
            [myTest print:20];
        }
        [myTest printValue:10 andValue:21];
        [myTest release];
        
        // 用协议方式
        id <MyProtocol> myProtocol = [[MyTest alloc] init];
        if ( [myProtocol respondsToSelector:@selector(print:)] ) {
            [myProtocol print:102];
        }
        [myProtocol printValue:103 andValue:105];
        
        [myProtocol release];
    }
    return 0;
}

 

 

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Objective-C高级编程(一)自动引用计数发布时间:2022-07-12
下一篇:
objective-c常用方法列表(总结)发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap