博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的代理和Block
阅读量:5122 次
发布时间:2019-06-13

本文共 1877 字,大约阅读时间需要 6 分钟。

一、代理(Delegate)

1)含义

iOS中的代理,比如父母要去上班,到中午12点了,需要给宝宝喂饭吃,但是父母正在上班,这时需要有一个人来帮忙完成一些事情(需要有个保姆来帮忙给宝宝喂饭),此时,保姆就是父母的代理。在中午12点得时候,父母告诉保姆,宝宝该吃饭了,此时,作为代理的保姆,就去给宝宝喂饭。

上面的故事中,保姆就是父母的代理。

2)代理的创建

  • 创建协议

    @protocol DLNameDelegate <NSObject>

  • 声明代理中的方法(@optional和@request)其中有可选实现和必须实现

    @optional

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

    @end

  • 创建Delegate属性

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

 

3)代理的使用

在调用代理处理业务时,先判断代理类是否存在且代理类是否实现代理方法

if(self.delegate != nil && [self.delegate respondsToSelector:@selector(fangfaName:)]){
     [self.delegate fangfaName:self];
 
二、block代码块
1)声明
//1.定义无参数无返回值的Block    void (^printBlock)() = ^(){        NSLog(@"no number");    };    printBlock();

可以看到 block的格式为: 返回值 (^Block名称)(参数类型)  = ^(参数类型 参数名){};

block之所以很好用,是因为block可以作为参数来进行传值或其他操作。

2)声明一个block参数

@property (copy,nonatomic) void (^MyBlock)(NSString *str);

block的属性声明需要用copy,这里稍后我会进行探讨。

typedef void (^MyBlockType)(NSString*);@property (copy,nonatomic) MyBlockType myBlock2;

这是另一种声明block属性的方式,通过typedef来定义一个别名,通过别名来直接定义block属性。

3)block的使用

线程安全:在调用时需要把Block先赋值给本地变量,以防止Block突然改变。因为如果不这样的话,即便是先判断了Block属性不为空,在调用之前,一旦另一个线程把Block属性设空了,程序就会crash,

MyBlockType block = self.myBlock2;    if (block) {        block(str);    }

一般情况:

if (self.MyBlock) {        self.MyBlock(str);    }

4)示例代码:

- (IBAction)clickblockbtn:(id)sender {//    MyBlockType block = self.myBlock2;//    if (block) {//        block(self.mytf.text);//        [self dismissViewControllerAnimated:YES completion:nil];//    }//        if (self.MyBlock) {        self.MyBlock(self.mytf.text);    }}

-(void)clickbtn{

    BViewController *vc = [[BViewController alloc]init];

    vc.delegate = self;

//    vc.MyBlock = ^(NSString *str){

//        self.mainLabel.text = str;

//    };

    vc.myBlock2 = ^(NSString *str){

        self.mainLabel.text = str;

    };

    [self presentViewController:vc animated:YES completion:nil];

}

 

转载于:https://www.cnblogs.com/iOSDeng/p/5073686.html

你可能感兴趣的文章
vue踩坑(二):跨域以及携带cookie
查看>>
第7弹;数组的排序和查找
查看>>
pat06-图4. Saving James Bond - Hard Version (30)
查看>>
使用Nginx在自己的电脑上实现负载均衡
查看>>
lnmp的安装--php
查看>>
表单相关-文件上传-下载-异步/同步提交
查看>>
MySQL高可用之组复制(4):详细分析组复制理论
查看>>
[转帖]谨以此文献给才毕业一两年的朋友 (选自同事信件)
查看>>
Django
查看>>
socket,获取html,webservice等,支持chunked,gzip,deflate
查看>>
《Java编程思想》之对象的集合(数组、List、Set、Map)二
查看>>
[转载]php连接postgreSQL数据库及其操作(php5,postgreSQL9)
查看>>
POJ1509 Glass Beads 【后缀自动机】
查看>>
BZOJ3571 [Hnoi2014]画框 【分治 + KM算法】
查看>>
uCOS-ii笔记
查看>>
网页渲染优化和JS性能提升
查看>>
BZOJ 3261 最大异或和(算竞进阶习题)
查看>>
JDBC
查看>>
Javaee基本框架(Struts2,Spring,MyBatista)之间的关系
查看>>
Java提高篇——对象克隆(复制)
查看>>