Object C中Block用法
先了解定义C语言的函数指针!
int sum (int x, int y) {
return x+ y;
}
// 定义函数
int (*p)(int, int) = sum;
NSLog(@"%ld", p(, ));
// 函数指针类型: int (*)(int, int);
// 函数指针变量: p;
// 函数指针的值: sum
看看block语法
block类型: int(^)(int, int)
block变量: block
block值: ^(int x, int y){
return x + y ;
};
定义block语法块
int (^block) (int , int) = ^(int x, int y) {
return x + y;
}
NSLog(@"%d", block(, ));
效果和上边的函数指针一样! 参照起来学习方便!
无返回值, 无参数 block 语法
void(^block1)(void) = ^(void) {
NSLog(@"无返回值, 无参数");
}
// 调用block1
block1();- 有返回值, 无参数
int(^block2)(void) = ^(void) {
return ;
}
NSLog(@"有返回值, 无参数%d", block2()); - 无返回值, 有参数
void (^block3)(int, int) = ^(int x, int y){
NSLog(@"%d + %d = %d", x, y, x +y);
};
调用
block3(, ); - 有返回值, 有参数
int (^block4)(int , int) = ^(int x, int y) {
return x + y;
}
block 调用
NSLog(@"%d", block4(, ));
block 与变量的关系
- block 与 局部变量的关系
int temp = ;
void (^block1)(void) = ^(void) {
NSLog(@"%d", temp++);
NSLog(@"%d", temp + );
}调用 block1();
如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?__block int temp2 = ; 用__block修饰一下变量, 便在block可以使用了
__block int temp2 = ;
void (^block9) (void) = ^(void){
temp2++; // 这样就可以修改了!
};
调用 block9();
结果 ; - block与全局变量.
在main函数外定义一个在main函数外定义一个temp3 = ;
void (^block11) (void) = ^(void){
temp3++;
NSLog(@"temp3 = %d", temp3 + );
};
调用 block11();
结果 temp3 = ;说明block中可以修改全局变量!
原文链接:http://www.jianshu.com/p/abb1eafeb068
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
Object C中Block用法的更多相关文章
- iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...
- iOS中block的用法 以及和函数用法的区别
ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候 MyBlock(); 带参数的 ...
- Java之Object对象中的wait()和notifyAll()用法
用一个例子来说明Object对象中的wait方法和notifyAll方法的使用. 首先定义一个消息类,用于封装数据,以供读写线程进行操作: /** * 消息 * * @author syj */ pu ...
- iOS 中Block以及Blocks的使用,闭包方法调用
OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- AngularJS select中ngOptions用法详解
AngularJS select中ngOptions用法详解 一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...
- c#初学-多线程中lock用法的经典实例
本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ...
- .NET3.5中JSON用法以及封装JsonUtils工具类
.NET3.5中JSON用法以及封装JsonUtils工具类 我们讲到JSON的简单使用,现在我们来研究如何进行封装微软提供的JSON基类,达到更加方便.简单.强大且重用性高的效果. 首先创建一个类 ...
- [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...
随机推荐
- Pycharm用Ctrl+鼠标滚轮调节代码字体大小
File --> Setting --> Editor --> General --> 勾选Change font size (zoom) with Ctrl+Mouse W ...
- Python 开发轻量级爬虫06
Python 开发轻量级爬虫 (imooc总结06--网页解析器) 介绍网页解析器 将互联网的网页获取到本地以后,我们需要对它们进行解析才能够提取出我们需要的内容. 也就是说网页解析器是从网页中提取有 ...
- URL类型入参串调用接口
最近通过调用另一个合作公司提供的接口实现方法,借鉴同事之前编写的方法 Models.JSON.Patient类中有各种属性,也可增加属性来满足新需求 public string TakeAppoint ...
- MFC中CListCtrl控件的使用方法
定义一个派生类CViewList 派生于CListCtrl 在要包含该控件的类(CView)中定义一个CViewList类型的变量 CViewList m_wndListView; 在CView响应的 ...
- 分布式追踪系统dapper
http://www.cnblogs.com/LBSer/p/3390852.html 最近单位需要做自己的分布式监控系统,因此看了一些资料,其中就有google的分布式追踪系统dapper的论文:h ...
- 教你几种在SQLServer中删除重复数据方法(转)
转载地址:http://www.jb51.net/article/22980.htm 方法一 复制代码 代码如下: declare @max integer,@id integer declare c ...
- display:box和display:inline-box的区别
display:box我想大家很熟悉,那么display:inline-box呢,今天在项目中需要设置这样的属性box-align:center,那么就想到用 display:box;如果设置BOX, ...
- svn在linux上的安装
什么是svnSVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subv ...
- Java 实现文件上传、下载、打包、文件copy、文件夹copy。
文件and文件夹copy package org.test; import java.io.*; public class FileCopy { /** * 复制单个文件 * * @param old ...
- VR技术驱动智慧旅游,自由漫步西湖不是梦
虚拟现实技术是今年最热门的科技之一,不少行业都在嫁接VR功能,其中旅游业也具备这方面的优势.VR+旅游,能让你足不出户即可感受清净唯美的名胜古迹.据591ARVR资讯网www.591arvr ...