Object-c 协议是什么 协议怎么用

关于协议有几个名词:协议、代理、委托,事实上这些都是描述一件事情。

scrn20151120123321

协议的用法:

1.首先声明一个协议

@protocl 协议名 <父协议> //父协议可选

@required

…………方法声明

@optional

…………方法声明

@end

2.在一个类中实现协议中的方法,这个类可以称为被委托人,或者叫做代理

@interface 类A:父类名<协议名>

…..

协议方法1

协议方法2

…..

@end

3.在一个类中遇到协议中的问题时,可以委托代理人来调用

@interface 类B

@proterty id <协议名> 代理人变量p//随意命名的变量,至少有一个,待会会对它赋值

@end

@implementation 类B

协议方法1{ [代理人p  协议方法];}

@end

4.主程序中调用

A * a = [A new];

B * b = [B new];

b.p = a;//这里把代理类的一个对象赋值给B类的代理成员变量,意思是说B类遇到协议中的方法就可以交给A类的a对象去做了。称为委托。

[b 协议方法];// 他会调用A 类中的实现

 

看到这里,是不是有一种想法,这和普通的调用没什么区别,就是B类调用A类的方法。

这里用协议给了这种调用一个限制,看起来就高深了一点点。

#import <Foundation/Foundation.h>


@protocol Works <NSObject>
@required
- (void) payoff;
- (void) tel;
@optional
- (void) dance;
@end    //工作协议,要求完成付款,打电话。可选完成跳舞任务


//===================

@interface Worker:NSObject  <Works>
//员工类,接受工作协议,实现工作方法
-(void) payoff;
-(void) tel;
-(void) dance;
@end

@implementation Worker

-(void) payoff
{
    NSLog(@"worker:payoff finish");
}
-(void) tel
{
    NSLog(@"worker:tel finish");
}
-(void) dance
{
    NSLog(@"worker:dance finish");
}

@end//员工类对工作协议的实现

//==========================

@interface Boss : NSObject
@property id<Works> deleagate_people;
    //boss类,他包含一个属性,用于将任务给委托人;
-(void) sing;

@end

@implementation Boss
@synthesize deleagate_people;
-(void) sing
{
    NSLog(@"boss :sing");
}

-(void) payoff
{
    [deleagate_people payoff];
}
-(void) tel
{
    [deleagate_people tel];
}
-(void) dance
{
    [deleagate_people dance];
}//这些方法中都调用了协议,将任务交给委托人去完成

@end

//==================

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Boss *boss1 = [Boss new];
        Worker * worker1 = [Worker new];
        boss1.deleagate_people = worker1;
        
        [boss1 sing];
        [boss1 dance];
        [boss1 payoff];
        [boss1 tel];
        
    }
    return 0;
}

 

 

如果文章对你有帮助,欢迎点赞或打赏(金额不限)。你的打赏将全部用于支付网站服务器费用和提高网站文章质量,谢谢支持。

版权声明:

本文由 原创,商业转载请联系作者获得授权。
非商业转载请注明作者 雅乐网 ,并附带本文链接:
https://www.yalewoo.com/object_c_protocol.html

上一篇:

下一篇:

我要评论

验证码*: 9 + 5 =