首页 > 代码库 > OC的协议

OC的协议

oc协议

在Object-C中,委托和数据源都是由协议实现的。协议定义了一个类与另一个类进行沟通的先验方式。

它们包含一个方法列表,有些是必须被实现的,有些是可选的。

任何实现了必需方法的类都被认为符合协议。

 

协议,是通过网络,计算机使用者进行通讯后,互相进行约定规定的集合。两个类进行通讯,用协议就比较方便。下面是CocoaChina 版主“angellixf”为新手写的协议入门介绍以及代码例子,希望对刚入门开发者有所帮助
一、说明
  1.协议声明了可以被任何类实现的方法
  2.协议不是类,它是定义了一个其他对象可以实现的接口
  3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议
  4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
  5:委托,就是调用自己定义方法,别的类来实现。
  6.新特性说明
    @optional预编译指令:表示可以选择实现的方法
    @required预编译指令:表示必须强制实现的方法

 

 

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>

 

@optional

- (void) print:(int)value;

// print: 是可选的

 

@required

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

// printValue:andValue: 这个方法是必须要实现的

@end

 

#import <Foundation/Foundation.h>

#import "MyProtocol.h"

@interface MyTest : NSObject <MyProtocol>

- (void) showInfo;

@end

 

#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

 

#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;

}