oc中代理的简单运用

Posted zhangxianhongx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oc中代理的简单运用相关的知识,希望对你有一定的参考价值。

今天和以为老同学聊了一些,深有感触,看它传值都是用代理写的,自己平时都是用block,通知之类的,基本不用代理,想想代理,感觉自己也有些模棱两可,所以动手写了一个代理简单运用的demo,写完之后思考了一番,在与block和通知做一些比较,豁然开朗,感觉自己在以后又多了一大助力。

我一贯的态度,做项目的思路源于基础,我不奢求自己什么都会,只要求自己学的都能基本掌握原理,从而达到心到,手到,运用自如。

关于代理之类的官方解释,我在此就不说了,不懂得,自己去查阅一些文档吧,这里只写它的原理和用法。

   代理不是类,只是一个方法声明的文件,先看它的创建方法

 

技术分享

file:///Users/mac/Desktop/01.png

file:///Users/mac/Desktop/02.png

代理文件中

//
//  ViewDelegate.h
//  代理的简单应用
//
//  Created by mac on 16/3/9.
//  Copyright © 2016年 WYP. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol ViewDelegate <NSObject>

- (void)creatViewInView;

- (void)addSub:(NSString *)str;

- (int)upSomething:(CGFloat)x;

@end

 被委托方,签署代理,实现代理方法的一方

//
//  ViewController.m
//  代理的简单应用
//
//  Created by mac on 16/3/9.
//  Copyright © 2016年 WYP. All rights reserved.
//

#import "ViewController.h"
#import "SViewController.h"
@interface ViewController ()<ViewDelegate>//类签署协议

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    SViewController *view = [[SViewController alloc] init];
#warning 设置代理对象
    view.ViewDelegate = self;
    
    
}
#pragma mark ViewDelegate
- (int)upSomething:(CGFloat)x{
    
    NSLog(@"x:%.1f",x);
    return 15;
}
- (void)addSub:(NSString *)str{
    
    NSLog(@"str:%@",str);
}
- (void)creatViewInView{
    
    NSLog(@"创建了");
}

@end

 委托方,调用代理方法的一方

//
//  SViewController.h
//  代理的简单应用
//
//  Created by mac on 16/3/9.
//  Copyright © 2016年 WYP. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "ViewDelegate.h"//引入协议
@interface SViewController : UIViewController
//设置协议属性,用于决定代理方法什么时候执行
@property (nonatomic, weak) id<ViewDelegate> ViewDelegate;

@end

 

//
//  SViewController.m
//  代理的简单应用
//
//  Created by mac on 16/3/9.
//  Copyright © 2016年 WYP. All rights reserved.
//

#import "SViewController.h"

@interface SViewController ()

@end

@implementation SViewController

- (id)init{
    if (self = [super init]) {
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//            判断如果代理对象不存在,不执行代理方法
            if (!_ViewDelegate) {
                
                return ;
            }
#pragma mark 调用代理中的方法
//            无参数也无返回值的代理方法
            if ([_ViewDelegate respondsToSelector:@selector(creatViewInView)]) {
                //外部判断,如果代理对象响应这个代理方法,才让其执行这个代理方法
                [_ViewDelegate creatViewInView];
                
            }
            
//            有参数无返回值的代理方法
            if ([_ViewDelegate respondsToSelector:@selector(addObject:)]) {
                
                [_ViewDelegate addSub:@"zhang"];
            }

//            有参数有返回值得代理方法
            if ([_ViewDelegate respondsToSelector:@selector(upSomething:)]) {
                
                int i = [_ViewDelegate upSomething:34.5];
                NSLog(@"i=%d",i);
                
            }
            
            
        });
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];

}
- (void)setViewDelegate:(id<ViewDelegate>)ViewDelegate{
    _ViewDelegate = ViewDelegate;
  
}

@end

 

技术分享

技术分享

技术分享

以上是关于oc中代理的简单运用的主要内容,如果未能解决你的问题,请参考以下文章

OC第九节——协议与代理

JS和OC交互的简单应用

OC中如何优化代理是否响应某个方法

Objective-C中的委托(代理)模式

33-oc协议&代理

OC的封装继承和多态