----------------------ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
在Object-C中,委托和数据源都是由协议实现的。协议定义了一个类与另一个类进行沟通的先验方式。它们包含一个方法列表,有些是必须被实现的,有些是可选的。任何实现了必需方法的类都被认为符合协议。
1. 基本用途
1.可以用来声明一大堆方法(不能声明成员变量)
2.只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
3.只要父类遵守了某个协议,就相当于子类也遵守了
2. 协议的格式
1.协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end
2.如何遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2>
@end
2> 协议遵守协议
1.一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开
2.一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
@protocol 协议名称 <其他协议名称1, 其他协议名称2>
@end
3> 定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2;
4>@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名;
@property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2;
3. 协议中方法声明的关键字
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
1.@required:这个方法必须要实现(若不实现,编译器会发出警告)
2.@optional:这个方法不一定要实现
4. 基协议
1.NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
2.其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
3.NSObject协议中声明很多最基本的方法,比如description、retain、release等
4.建议每个新的协议都要遵守NSObject协议
5.协议注意:
1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
1.定义一个名叫MyProtocol的协议:
#import <Foundation/Foundation.h>
@protocol MyProtocol <NSObject>
@optional
- (void) print:(int)value;
// print: 是可选的
@required
- (int) printValue:(int)value1 andValue:(int)value2;
// printValue:andValue: 这个方法是必须要实现的
@end
2.声明一个MyTest类遵守MyProtocol协议
#import <Foundation/Foundation.h>
#import "MyProtocol.h"
@interface MyTest : NSObject <MyProtocol>
- (void) showInfo;
@end
3.在
MyTest类的实现中实现协议中定义的方法
#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
4.在main函数中使用这个协议
#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;
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------