一、代理(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. 第八十二节,CSS3过渡效果

    CSS3过渡效果 学习要点: 1.过渡简介 2.transition-property 3.transition-duration 4.transition-timing-function 5.tra ...

  2. html5权威指南:表单元素

    一.表单标签: 表单标签:http://blog.csdn.net/mylovestart/article/details/8589002 html5新增表单元素: 1.datalist:http:/ ...

  3. AnimatorController动画遮罩

    游戏中,我们的人物在某些时候,可能在一个时间点在做两件事,这样就需要同时播放两个动画,但我们肯定不能简单将其叠加,比如移动着开枪.攻击.挥手等等,那么在Unity中我们应该怎样实现这样的功能呢?且听我 ...

  4. Android 切横竖屏时走的生命周期方法?222

    第一种情况: 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 第二种情况: 设置Activity的androi ...

  5. netty初探(1)

    参考目录: 1. user-guide : http://netty.io/wiki/user-guide-for-4.x.html 2. demo: http://netty.io/wiki/ 3. ...

  6. 自己写的POIUtil,主要解决从不同的HSSFWorkbook复制sheet以及根据单元格插入图片等

    复制sheet的原始代码网上找的,但是小问题很多,然后自己动手改了一下: 根据单元格信息动态插入图片,如果单元格有文字,图片的位置会在文字之后,如果同样的位置已有图片则会往下插入. import or ...

  7. webapi中的路由约束

    Route Constraints Route constraints let you restrict how the parameters in the route template are ma ...

  8. LeetCode OJ 4. Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  9. Chapter 16_1 Class

    一个类就是一个创建对象的模具.对于一些基于原型的语言,对象是没有“类型”的,而是每个对象都有一个原型(prototype). 原型也是一种常规的对象.当其他对象(类的实例)遇到一个未知操作时,原型会先 ...

  10. 基于多线程多用户的FTP服务器与客户端功能实现

    项目介绍: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当 ...