一、代理

1.代理的介绍

  代理是一种通用的设计模式  

   代理使用方式:A 让 B 做件事,空口无凭,签个协议。

   所以代理有三部分组成:

       委托方: 定义协议

       协议   : 用来规定代理方可以做什么,必须做什么

       代理方: 按照协议完成委托方的需求

2. 协议的介绍

  协议是定义了一套公用的接口,是方法的列表,但是无法实现。

  可以通过代理,实现协议中的方法。

  协议是公用方法,一般写在一个类里面。

  如果多个类都使用这个协议,可以写成一个peotocol文件。

3.代理的使用

  (1)委托某人做某事

     先建立一个Custom类,Custom类要买东西,就定下一个协议,实现协议的人,就实现custom协议里的方法。

     Custom.h

#import <Foundation/Foundation.h>
@class Customer; @protocol CustomerDelegate <NSObject> @required -(void)custom:(Customer*)Customer buyThingNum:(int)count; @end @interface Customer : NSObject @property(nonatomic,weak)id<CustomerDelegate>delegate; -(void)buyThingNum:(int)count; @end

    Custom.m

#import "Customer.h"

@implementation Customer

-(void)buyThingNum:(int)count
{
if (self.delegate && [self.delegate respondsToSelector:@selector(custom:buyThingNum:)]) {
[self.delegate custom:self buyThingNum:];
}
} @end

viewController.m

#import "ViewController.h"
#import "Customer.h"
@interface ViewController ()<CustomerDelegate> @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Customer *custom = [[Customer alloc]init];
custom.delegate = self;
[custom buyThingNum:];
} -(void)custom:(Customer*)Customer buyThingNum:(int)count
{
NSLog(@"%d",count);
}
@end

(2)反向传值

     定义一个CustomViewController的类,在CustomViewController.h中定义协议。

#import <UIKit/UIKit.h>

@protocol PassValueDelegate <NSObject>

@required

-(void)buyThingNum:(int)num;

@end

@interface CustomViewController : UIViewController

@property(nonatomic,weak) id<PassValueDelegate>delegate;

@end

在CustomViewController.m中定义一个方法,如果设置了代理,并且代理实现了协议的方法,那么就执行代理方法。

#import "CustomViewController.h"

@interface CustomViewController ()

@end

@implementation CustomViewController

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
} -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
if (self.delegate && [self.delegate respondsToSelector:@selector(buyThingNum:)]) {
[self.delegate buyThingNum:];
}
} @end

在ViewController类中,设置代理,实现代理方法。

import "ViewController.h"
#import "CustomViewController.h"
@interface ViewController ()<PassValueDelegate> @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
} -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
CustomViewController *customVC = [[CustomViewController alloc]init];
customVC.delegate = self;
[self presentViewController:customVC animated:YES completion:nil];
} -(void)buyThingNum:(int)num
{
NSLog(@"%d",num);
} @end

二. 通知

1. 通知的发送: 系统通过一个叫通知中心进行的,通知中心是一个单例。

    NSNotification *notifacation = [NSNotification notificationWithName:@"passValue" object:@"哈哈" userInfo:@{@"num":@""}];
[[NSNotificationCenter defaultCenter]postNotification:notifacation];

 2.接收通知

- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(buyThingNum:) name:@"passValue" object:nil];
} -(void)buyThingNum:(NSNotification *)noti
{
NSString *wordStr = [noti object]; NSDictionary *dic = [noti userInfo];

  //拿到通知的值
NSLog(@"%@",wordStr);
NSLog(@"%@",dic);

}

3.移除通知

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"passVaule" object:self];

打印结果:

2017-06-24 21:53:01.021 DelegateTest[15607:2194987] 哈哈

2017-06-24 21:53:01.021 DelegateTest[15607:2194987] {

num = 10;

}

 

三、通知与代理的优缺点

(1)通知可以一对多通信,代理只能一对一。

(2)代理的执行效率比较高。

(3)通知的使用比较简单。

(4)通知太多的情况下,代码比较难维护。

iOS---代理、协议、通知 详解的更多相关文章

  1. “iOS 推送通知”详解:从创建到设置到运行

    这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...

  2. ios开发——实用技术OC-Swift篇&本地通知与远程通知详解

    本地通知与远程通知详解 一:本地通知   Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...

  3. IOS—UITextFiled控件详解

    IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...

  4. [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解

    技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解    http://www.52im.net/thread-1309-1-1.html   本文来自腾讯资深研发工程师罗成的技术分享, ...

  5. 协议分析 - DHCP协议解码详解

    协议分析 - DHCP协议解码详解 [DHCP协议简介]         DHCP,全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 ...

  6. Memcache的使用和协议分析详解

    Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...

  7. iOS 单元测试之XCTest详解(一)

    iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...

  8. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  9. IOS中UITableViewCell使用详解

    IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...

  10. iOS 后台持续定位详解(支持ISO9.0以上)

    iOS 后台持续定位详解(支持ISO9.0以上) #import <CoreLocation/CoreLocation.h>并实现CLLocationManagerDelegate 代理, ...

随机推荐

  1. Opencv(3):基本数据类型

    1.比较简单的原子类型 结构 成员 意义 CvPoint int x,y 图像中的点 CvPoint2D32f float x,y 二维空间中的点 CvPoint3D32f float x,y,z 三 ...

  2. Jetty配置

    类似TomCat 登陆官网www.eclipse.org Download下载Jetty zip压缩版 解压到文件夹,打开idea的Config->Jetty-server->Local- ...

  3. C++中string的使用

    概述 这篇博文为了记录C++中string的使用,用到一点补充一点. 预备 使用string之前需要包含头文件 #include<iostream> #include<string& ...

  4. hashchange事件

    h5新增了hashchange事件,以便在URL参数列表(及URL中‘#’号后面的所有字符串),发生变化时通知开发人员. 之所以要添加这个事件,是因为在Ajax应用中,开发人员经常要利用URL参数列表 ...

  5. DocumentType类型

    并不常用 nodeType 10 nodeName doctype的名称 NodeValue 值为null parentNode Document 不支持子节点 DocumentType不能动态创建, ...

  6. php 16进制颜色代码转换为rgba,rgb格式

    <?php $rgb = hex2rgba('#FFFFFF', false, true); echo 'rgb: '.$rgb[0].','; echo $rgb[1].','; echo $ ...

  7. SQL编写-谁和谁是好朋友

    problem: 用户表 姓名 张三 李四 王五       好友表   姓名 好友姓名 张三 李四 张三 王五 李四 张三 用户表里面姓名必须在好友表里面互加为好友,请问如何找出还没有加为好友的姓名 ...

  8. 绑定弹窗事件最好的方法,原生JS和JQuery方法

    使用jQuery ui = { $close: $('.close') , $pop: $('.pop') , $topopBtn: $('.topop-btn') , $popbtnArea: $( ...

  9. 【repost】对JAVASCRIPT匿名函数的理解(透彻版)

    Query片段: view plaincopy to clipboardprint? (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其 ...

  10. 【git】git简单使用教程

    git的简单使用教程: 1.安装git bash客户端 2.打开git bash,cd到需要存储代码的路径下, 执行:git clone -b deploy ssh://git@gitlab.xxxx ...