黑马程序员_OC协议

----------------------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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值