一、代理(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];

}

iOS中的代理和Block的更多相关文章

  1. Swift基础--通知,代理和block的使用抉择以及Swift中的代理

    什么时候用通知,什么时候用代理,什么时候用block 通知 : 两者关系层次太深,八竿子打不着的那种最适合用通知.因为层级结构深了,用代理要一层一层往下传递,代码结构就复杂了 代理 : 父子关系,监听 ...

  2. 代理和block反向传值

    代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(v ...

  3. 代理和 block 传值的使用

    // // ZYViewController.h // BlockTest // // Created by yejiong on 14/11/2. // Copyright © 2014年 zzz. ...

  4. Java中jdk代理和cglib代理

    代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 在Java中代理模式从实 ...

  5. 使用代理和block写一个alertView

    代理: MyAlertView.h: @property (nonatomic,assign)id delegate; @protocol MyAlertViewDelegate <NSObje ...

  6. iOS中消息传递方式

    iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 1.通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. NSNotificati ...

  7. iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

  8. IOS中block和代理

    从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...

  9. IOS中的Block与C++11中的lambda

    ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...

随机推荐

  1. ViewBag的简单使用

    一,在控制器中写好数据绑定 //通过ID查找出整列的数据            Case.Models.Case theCase = db.Case.Find(id);            View ...

  2. spring security 1

    首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置.使用Spring Security我们需要引入Spring Sec ...

  3. POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)

    ( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  4. java中的字符编码方式

    1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...

  5. FZU 1896 神奇的魔法数 dp

    网上都说是数位dp 但是虽然在队伍里负责动态规划 但是数位dp还不会…… 百度了一下 发现和最大子序列思路差不多…… 最大子序列的dp[i][j]是表示两个序列前i项和前j项的最大子序列…… dp[i ...

  6. Set下面HashSet,TreeSet和LinkedHashSet的区别

    Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...

  7. html 图片上传预览

    Html5 upload img 2012年12月27日 20:36 <!DOCTYPE HTML> <html> <head> <meta http-equ ...

  8. toggle的使用心得

    点击同一个标签可以实现不同效果 或者几个效果 以前一般都是if 判断的 逻辑还有判断比较繁琐 看啦手册后 发现这个功能可以不用判断的自动循环点击事件 比以前的简单好用 主要用法:$("td& ...

  9. Android 5.0之后屏幕截图的方法

    截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...

  10. Chapter 2 Open Book——16

    By Friday I was perfectly comfortable entering my Biology class, nolonger worried that Edward would ...