黑马程序员_OC协议

来源:互联网 发布:70台网吧网络组建方案 编辑:程序博客网 时间:2024/05/20 08:43

----------------------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协议中声明很多最基本的方法,比如descriptionretainrelease

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培训、期待与您交流! ----------------------












0 0
原创粉丝点击