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