一、代理(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. Chapter 2 Open Book——25

    "My name is Edward Cullen," he continued. "I didn't have a chance to introduce myself ...

  2. iOS开发app上架流程之证书的制作

    1.证书的制作:登陆 https: 1.1appid的注册 选择Identifiers 下的App IDs然后如图所示 点击加号,进入 App ID Description下的Name:这个是appI ...

  3. Django剖析

    $django-admin startproject mysite  创建一个django新工程 $python manage.py runserver 开启该服务器 $python manage.p ...

  4. gcc 编译

    ../gcc-5.2.0/configure --enable-threads=posix --disable-checking --disable-multilib --enable-languag ...

  5. JSP中 JSTL

    1,JSTL是JSP的标准标签库的简称,JSP标准标签库包括5类:分别是核心标签库,国际化标签库,SQL标签库,XML标签库,函数标签库: 2,常用的就是核心标签库和SQL标签库: 核心标签库:前置名 ...

  6. Leetcode016 3Sum Closest

    public class S016 { //借鉴S015的思想,只是稍微有点慢 public int threeSumClosest(int[] nums, int target) { Arrays. ...

  7. webservice整合spring

    接口HelloWorld需要添加webservice注解 package com.cs.webservice; import java.util.List; import javax.jws.WebP ...

  8. 将MyEclipse中的项目导入到Eclipse中报错的解决放法

    1.导入项目后,会报红色感叹号, 将项目右键,点击红色框.

  9. px和em,rem的区别

    任意浏览器的默认字体高都是16px. px: 像素(Pixel) , 计算机屏幕上的一个点.固定大小:不方便维护: em:相对于当前对象内 (父元素) 文本的字体尺寸.如当前对行内文本的字体尺寸未被人 ...

  10. split分割字符串时的一些特殊分隔符

    @Test public void testSplit() { String address = "上海.上海市.闵行区.吴中路"; String[] splitAddress = ...