Block 是 带有自动变量的匿名函数。

   emmmm 反正我看了也不懂,我们一点点用具体的例子分析一下block。

  1. 我们现在要在一个文件中使用block(我们后面再提到两个界面传值的block的例子)

   void (^ourblo)(void);

这样就声明了一个叫做 ourblo 的 block,但是他是空的。

符号 " ^ " 代表block,这个block的名字叫做 " ourblo "。(里面的几个void我们后面再说)

  我们有以下这个例子:

    void (^ourblo)(void) = ^(void){
NSLog(@"呵呵");
}; ourblo();

在这里我们给他赋了一个值(即 等号后面的内容)。

我们可以把它看作一个函数,这个函数的内容就是打印“呵呵”两个字。

在声明了这个block之后,我们直接用 ourblo() 的方式就可以使用它。

  2.现在我们需要使用一个,可以传值进去的block,我们把上面的代码稍微改一下,就可以得到下面这个:

    void (^ourblo)(NSString *str) = ^(NSString *str){
NSLog(@"%@", str);
}; NSString *myStr = @"呵呵呵"; ourblo(myStr);

注意看,我们把第一个例子里的 两个 void 都替换成了 NSString *str,这就是我们要传给这个函数的输入值。

这个时候,ourblo的功能就变成了,打印出我们传给它的字符串。

  3.继续,我们现在需要一个block帮我们判断,我们传入的字符串是不是“呵呵”:

    BOOL (^ourblo)(NSString *str) = ^(NSString *str){
if ([str isEqualToString:@"呵呵"]) {
//字符串是“呵呵”
return YES;
} else {
return NO;
}
}; NSString *myStr = @"呵呵"; BOOL isHeHe = ourblo(myStr);

我们把剩余的最后一个 void 改成 BOOL ,这就是我们想得到的这个函数输出的值的类型。

这个例子里,函数就满足了我们上面说的这个功能。是“呵呵”的时候他会返回 YES,不是的时候会返回 NO。

  4.在上面的例子里,我们把block当作函数去理解。不过 block 是可以被赋值的,比如下面这样:

    BOOL (^ourblo)(NSString *str);//这句代码 初始化 ourblo

    ourblo = ^(NSString *str) {
if ([str isEqualToString:@"呵呵"]) {
return YES;
} else {
return NO;
}
}; NSString *myStr = @"呵呵"; BOOL isHeHe = ourblo(myStr); // 对 ourblo 重新赋值
ourblo = ^(NSString *str) {
return NO;
}; BOOL isHeHe2 = ourblo(myStr); NSLog(@"%@,%@",@(isHeHe), @(isHeHe2));

我们对 ourblo 进行重新赋值,会看到最后打印出来的结果是 1 , 0

即一个 YES,一个 NO,说明重新赋值之后,再使用 ourblo时,它的逻辑确实被修改了。

  5.在另一篇里讲了如何通过 block 实现两个页面的传值和交互。

https://www.cnblogs.com/OranBlog/p/5861826.html

其实,它的原理可以看作,B中定义的“函数”,在 A 中被赋值,然后被B调用。

[OC] Block 是什么的更多相关文章

  1. Swift3.0 函数闭包与OC Block

    刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...

  2. OC Block网上转载

    1.block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量. 2.默认情况下block使用到的局部变量都会被复制,而不是保留.所以它无法改变局 ...

  3. OC BLOCK和协议

    一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. block实际上是: 指向结构体的指针 BOLC ...

  4. OC block的简单使用

    http://blog.csdn.net/itpeng523/article/details/23965147 一.先用Xcode创建一个空工程 学习block之前先用弄懂c语言的函数指针 看代码: ...

  5. iOS - OC Block 代码块

    前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...

  6. oc block基本使用

    // // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All ...

  7. [OC] Block的使用

    由ControllerA跳转到controllerB,在controllerB中选择一个参数的值,并将它传回给controllerA. 首先,在controllerB的.h文件中写入: @interf ...

  8. OC Block(代码块)

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  9. OC block声明和使用

    #import "Button.h" typedef int (^MySum) (int, int); void test() { // 定义了一个block,这个block返回值 ...

  10. oc block 遍历数组及字典

    原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count ...

随机推荐

  1. Dubbo 中 Zookeeper 注册中心原理分析

    vivo 互联网服务器团队- Li Wanghong 本文通过分析Dubbo中ZooKeeper注册中心的实现ZooKeeperResitry的继承体系结构,自顶向下分析了AbstractRegist ...

  2. JSP第五次作业

    1.教材P78-79  例4-9 1 <%@ page language="java" import="java.util.*" pageEncoding ...

  3. cv::Mat::step详解

    1.简介 step的几个类别区分: step:矩阵第一行元素的字节数 step[0]:矩阵第一行元素的字节数 step[1]:矩阵中一个元素的字节数 step1(0):矩阵中一行有几个通道数 step ...

  4. 2021级《JAVA语言程序设计》上机考试试题4

    现在就是写学生,学生查看个人信息,,修改个人密码,学生功能页的页面,代码最一开始给了 然后,这三个比较紧密,所以一起写了 学生功能页 <%@ page language="java&q ...

  5. odoo 给列表视图添加按钮实现数据文件导入

    实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 模块文件组织结构 说明:为了更好的表达本文主题,一些和主题无关的文件.代码已略去 odoo14\cus ...

  6. 从零实现在线云相亲APP|程序员脱单神器(内附源码Demo)

    实时音视频通话涉及到的技术栈.人力成本.硬件成本非常大,一般个人开发者基本无法独立完成一个功能健全并且稳定的实时音视频应用.本文介绍一天之内,无任何实时音视频低层技术的android开发者完成实时相亲 ...

  7. grafana展示的CPU利用率与实际不符的问题探究

    问题描述 最近看了一个虚机的CPU使用情况,使用mpstat -P ALL命令查看系统的CPU情况(该系统只有一个CPU core),发现该CPU的%usr长期维持在70%左右,且%sys也长期维持在 ...

  8. LAMP环境搭建——最详细的手工编译

    环境:阿里云服务器ECS,Alibaba Cloud Linux 3.2104 LTS 64位 ,2核(vCPU) 2 GiB LAMP 是搭建Web应用时最常用的环境,LAMP 分别表示 Linux ...

  9. 为了安装alien,我更新了yum源,结果还是没装上

    前几天把自己的thinkpad E430C从win7系统装成了centos7,看过<周末折腾了两天,踩了无数个坑,终于把win7装成了centos7>的小伙伴都知道,为了把win7装成ce ...

  10. 常见数据库mysql、oracle和DB2中is null 和 =null 的区别

    问题背景:前段时间我在测试过程中上传一个文件,文件内容要求判断为空,结果出现了报错,跟踪原因发现是开发误将oracle中对null的判断方式写成了=null,下面梳理一下不同数据库对该问题的处理方法: ...