一、代理

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. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  2. [转]ajQuery的deferred对象详解

    来自:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html 作者:  ...

  3. mac os 下 Android Studio设置真机调试

    http://www.cnblogs.com/developer-wang/p/6719555.html 如果没有 .bash_profile 只需要创建 .bash_profile,然后增加andr ...

  4. 菜品识别 SDK调用

    from aip import AipImageClassify import os """ 填入参数 """ APP_ID = 'your ...

  5. boost-使用说明

    1. boost库中大部分组件不需要编译,直接包含对应头文件即可使用,如#include "boost/array.hpp",因为组件的声明和实现都包含在头文件hpp中. 其它一些 ...

  6. 研究生flag

    是时候定个计划了,感觉日子一天天水,不加油学点东西,迟早要掉队…… 刷刷算法题库吧,貌似选几个管用的刷刷——https://hihocoder.com/problemset 争取明年三月份的PAT顶级 ...

  7. javascript 经典问题汇总

    1. ["1","2","3"].map(parseInt) 为多少?答:[1,NaN,NaN]array.map(function(cur ...

  8. Build Laravel Blog PigJian by PHP7 and Nginx on Ubuntu

    Recently, I found an interesting framework Laravel written by PHP. i have never used PHP to write an ...

  9. (01背包 第k优解) Bone Collector II(hdu 2639)

    http://acm.hdu.edu.cn/showproblem.php?pid=2639       Problem Description The title of this problem i ...

  10. noip第25课作业

    1.   求一个有向图所有顶点入度的和 输入有向图的顶点个数,边数以及各顶点之间的关联情况,要求求出这个有向图的所有顶点入度的总和. [输入格式] 第1行:2个空格分开的整数n(2<=n< ...