8.ios-Protocol

BoosProtocol.h

#import <Foundation/Foundation.h>
//创建协议
@protocol BoosProtocol <NSObject>
@required
//必须实现的方法
-(NSInteger)buyWood;
@optional
//可选实现
-(void)text3;
@end

WorkeProtocol.h

#import <Foundation/Foundation.h>

@protocol WorkeProtocol <NSObject>
-(void)salary;

@end

Boss.h

#import <Foundation/Foundation.h>
#import "BoosProtocol.h"
#import "WorkeProtocol.h"
@interface Boss : NSObject<WorkeProtocol>
//拥有委托权
//必须用weak
@property(nonatomic,weak)id <BoosProtocol>delegate;
@property(nonatomic,copy)NSTimer*myTime;
-(void)wantWood;
@end

Boss.m

#import "Boss.h"

@implementation Boss

- (instancetype)init
{
    self = [super init];
    if (self) {
        /*
         第一个参数:时间间隔
         第二个参数:实现位置
         第三个参数:调用的方法
         第四个参数:携带参数
         第五个参数:是否可以重复

         */
        _myTime=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(wantWood) userInfo:nil repeats:YES];
    }
    return self;
}

-(void)wantWood{
    if (_delegate&&[_delegate respondsToSelector:@selector(buyWood)]) {
        NSInteger n =[_delegate buyWood];
        if (n>=100) {
            //判断定时器是否运行
            if ([_myTime isValid]) {
                [_myTime invalidate];
                _myTime=nil;
            }
            CFRunLoopStop(CFRunLoopGetCurrent());
        }

    }

}

-(void)salary{
    NSLog(@"表现很好,工资5000,奖金1000");
}

@end

Worker.h

#import <Foundation/Foundation.h>
#import "BoosProtocol.h"
#import "WorkeProtocol.h"
//遵守协议
@interface Worker : NSObject<BoosProtocol>
@property(nonatomic,assign)NSInteger progress;
@property(nonatomic,weak)id<WorkeProtocol>delegate;
-(void)getMoney;
@end

Worker.m

#import "Worker.h"

@implementation Worker
- (instancetype)init
{
    self = [super init];
    if (self) {
        _progress=0;
    }
    return self;
}

-(void)getMoney{
    if (_delegate&&[_delegate respondsToSelector:@selector(salary)]) {
        [_delegate salary];
    }

}
//实现协议
-(NSInteger)buyWood{
    _progress+=10;
    NSLog(@"当前进度%zi",_progress);
    if (_progress>=100) {
        [self getMoney];
    }
    return _progress;
}
@end

main.m

/*
 代理对象=delegate
 代理模式的实现步骤:
 1. 创建协议文件,定义协议he方法
 2. 代理对象遵循协议
 3. 指定代理对象
 4. 通过代理调用方法
 */

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Boss*boos=[[Boss alloc]init];
        Worker*worke=[[Worker alloc]init];
        //3.boss指定代理对象worker
        //一对一
        boos.delegate=worke;
        worke.delegate=boos;
        //boss提出需求
        //通过代理调用方法
        //[boss wantWood];

        //[[NSRunLoop mainRunLoop] run];
        CFRunLoopRun();

    }
    return 0;
}
时间: 2024-12-30 04:00:38

8.ios-Protocol的相关文章

IOS Block详解

这是我原先写的OC中关于协议和代理的文章,建议大家阅读此篇文章的时候先阅读此文章,便于大家理解:  IOS Protocol与Delegate详解(一)  IOS Protocol与Delegate详解(二) 官方中对于Block的用途为:  You can use blocks to compose function expressions that can be passed to API, optionally stored, and usedby multiple threads. Bl

iOS学习资源搜集

最快速的学习方法是站在别人的肩上,当有人给你垫脚,那就必须往远处看.以下是遇到的一些好的学习资源. AutoLayout / SizeClass 开始iOS 7中自动布局教程(一) 开始iOS 7中自动布局教程(二) Auto Layout 使用心得(一)—— 初体验 Auto Layout 使用心得(二)—— 实现三等分 xcode6中自动布局autolayout和sizeclass的使用 xcode6下使用autolayout+sizeclass实践 ios8新特性屏幕适配之sizeclas

STOMP Over WebSocket原文

What is STOMP? STOMP is a simple text-orientated messaging protocol. It defines an interoperable wire format so that any of the available STOMP clients can communicate with any STOMP message broker to provide easy and widespread messaging interoperab

STOMP Over WebSocket

Show Table of Contents What is STOMP? STOMP is a simple text-orientated messaging protocol. It defines an interoperable wire format so that any of the available STOMP clients can communicate with any STOMP message broker to provide easy and widesprea

[HMLY]12.iOS中的Protocol

最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property.查来查去,只是知道和protocol有关.晚上问了下朋友(iOS大神),结果被他一句点破.发现这部分知识点遗漏了一点. protocol类似java中的interface,主要是用来定义一套对象之间的通信规则.protocol也是我们设计时常用的一个东西,相对于直接继承的方式,protocol则偏向于组合模式.因为在设计对象的

转iOS中delegate、protocol的关系

iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolcategoryobject-c 刚开始接触iOS,对delegate.protocol这两个概念比较模糊.参考了一些资料,记录下来体会. 1.protocol protocol和interface的概念类似,是object-c语法的一部分.protocol就是一系列不属于任何类的方法的列表.其中声明

奔五的人学IOS:Swift中的protocol及其应用实例

最近在学习ios抓取网页内容时遇到各种重复代码的问题,看着这么多重复的代码,感觉实在不爽,于是学习了ios的protocol. 在我看来这个protocol其实应该是Java中的interface. 也就是定义一个协议(或者叫接口),定义一堆方法,让实现了该方法的类的实例传入即可. 在我的工程中,抓取不同网页的viewcontroller,获取网页的代码完全是一模一样的,除了网址不同以外,别无二致,所以这一部分提取出来作为一个类,专门实现上网取数据,数据取到了需要通知viewcontroller

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

[IOS]Type &#39;NSObject&#39; does not conform to protocol &#39;NilLiteralConvertible&#39;

在使用一个cell的时候发生的, func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView .dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell if(cell ==

IOS开发之——Protocol协议的使用

protocol ['pr?ut?k?l] (例子:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一.说明 两个类进行通讯,用协议就比较方便. 1.协议声明了可以被任何类实现的方法 2.协议不是类,它是定义了一个其他对象可以实现的接口 3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议. 4.协议经常用来实现委托对象.一个委托对象是一种用来协同或者代表其他对象的特殊对象. 5:委托,就是调用自己定义方法,别的类来实