[OC] Block 是什么
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 是什么的更多相关文章
- Swift3.0 函数闭包与OC Block
刚接触Swift,如有不对的点,欢迎指正.转载请说明出处 定义一个基本函数 //定义一个函数,接收一个字符串,返回一个String类型的值 func test(name:String) -> S ...
- OC Block网上转载
1.block是一个特殊的OC对象, 它建立在栈上, 而不是堆上, 这么做一个是为性能考虑,还有就是方便访问局部变量. 2.默认情况下block使用到的局部变量都会被复制,而不是保留.所以它无法改变局 ...
- OC BLOCK和协议
一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. block实际上是: 指向结构体的指针 BOLC ...
- OC block的简单使用
http://blog.csdn.net/itpeng523/article/details/23965147 一.先用Xcode创建一个空工程 学习block之前先用弄懂c语言的函数指针 看代码: ...
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
- oc block基本使用
// // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All ...
- [OC] Block的使用
由ControllerA跳转到controllerB,在controllerB中选择一个参数的值,并将它传回给controllerA. 首先,在controllerB的.h文件中写入: @interf ...
- OC Block(代码块)
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- OC block声明和使用
#import "Button.h" typedef int (^MySum) (int, int); void test() { // 定义了一个block,这个block返回值 ...
- oc block 遍历数组及字典
原遍历数组NSArray * lines = ...for (NSString * line in lines) { // ...}for (int i = 0; i < lines.count ...
随机推荐
- Gitlab配置ssh_key
一.背景 当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码.那么我们就 ...
- 1月9日内容总结——linux相关知识简介、虚拟化软件vmware、远程链接工具xshell
目录 一.linux常见岗位 二.计算机的种类与服务器 三.服务器品牌 四.服务器内部组成 五.服务器磁盘阵列 六.linux简介 1.什么是linux 2.linux发展史 3.Linux系统的特点 ...
- 2023.1.16[模板]BSGS/exBSGS
2023.1.16 [模板]BSGS/exBSGS 全称Boy Step Girl Step 给定一个质数 p,以及一个整数 a,一个整数 b,现在要求你计算一个最小的非负整数 l, 满足\(a^x ...
- CC1链详解
前言:这篇文章是对CC1的总结,个人学习,如有不对请多指教.谢谢! 环境:jdk8u71以下,因为在该jdk版本以上这个漏洞已经被修复了 下载链接:https://www.oracle.com/cn/ ...
- Idea未识别maven项目
https://blog.csdn.net/qq_41460654/article/details/120539509
- 二分查找 & 移除元素
一.二分查找 704.二分查找 leetcode链接 1.二分查找方法概述 二分查找是针对有序数组的一种查找方式.是利用(letf+right)/2 = mid的方式来对半缩短搜索范围的一种方法,一次 ...
- vue开发大屏项目屏幕适配问题解决方案
1.新建自定义指令文件如下: 2.文件中插入一下代码: import { App, Directive, DirectiveBinding, nextTick } from 'vue' import ...
- java环境变量配置-最新版
安装 百度"java下载"进入官网下载最新版,闭着眼睛安装: 配置jre 因java11以上不自带jre,需要我们自己配置,配置如下: # 终端进入jdk所在的目录后执行 bin\ ...
- SpringCloud 源码学习笔记2——Feign声明式http客户端源码分析
系列文章目录和关于我 一丶Feign是什么 Feign是一种声明式. 模板化的HTTP客户端.在Spring Cloud中使用Feign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一一样的 ...
- 《话糙理不糙》之如何在学习openfoam时避免坑蒙拐骗
今天开启一个单独的系列 <话糙理不糙> - 谁要和你说学openfoamC++基础不重要,那就是放氨气,非常误人 这就好比没读过外国文献的人和你说不需要学专业英语一样 谜底就在谜面里,程序 ...