Block介绍(一)基础

一、概述

Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。

二、热身

先看一个比较简单的Block例子:

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
}; 

在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?

来,让我们typedef一下

typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
typedef int (^IntBlock)(void);//一个没有参数,返回int的block
typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block 

三、更详细的例子

主动调用一下:

- (void)someMethod
{
    BoolBlock ablock = ^(BOOL bValue) {
        NSLog(@"Bool block!");
    };

    ablock();
} 

作为参数返回:

typedef void (^BoolBlock)(BOOL);
- (BoolBlock)foo()
{
    BoolBlock ablock = ^(BOOL bValue) {
        NSLog(@"Bool block!");
    };
    return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
} 

类的一个成员:

@interface OBJ1 : NSObject
@property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
@end

OBJ1 *obj1 = ...
obj1.block = ^(BOOL bValue) {
        NSLog(@"Bool block!");
    }; 

其他函数的参数:

- (void)foo(BoolBlock block)
{
    if (block) {
        block();
    }
} 

甚至其他block的参数:

BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
HugeBlock hBlock = ^(BoolBlock bB) {bB();};

hBolck(bBlock); 

啊,全局变量!:

static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
int main()
{
    printf("%d\n", maxIntBlock(2,10));
    return 0;
} 

四,特殊的标记,__block

如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:

int main()
{
    __block int i = 1024;
    BoolBlock bBlock = ^(BOOL bV) {
        if (bV) {
            i++;//如果没有__block标记,是无法通过编译的。
        }
    };
} 
时间: 2024-11-15 06:03:44

Block介绍(一)基础的相关文章

HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素

欢迎大家阅读HTML5 Canvas(画布)实战编程初级篇系列,在这个系列中,我们将介绍最简单的HTML5画布编程.包括: 画布元素 绘制直线 绘制曲线 绘制路径 绘制图形 绘制颜色,渐变和图案 绘制图片 绘制文本 相关要求 环境要求:Google Chrome, Firefox, Safari, Opera, 或者 IE9以上的现代浏览器 编程要求:需要有基础的HTML和Javascript编程经验,相关的画布编程将调用Javascript API来处理 HTML Canvas基本元素 HTM

LYNC2013介绍和基础架构准备角色

LYNC2013部署系列PART1:LYNC2013介绍和基础架构准备 前言:LYNC 2013发布已经很久了,本人一直在进行相关的学习和测试,在有限的资源条件下,把能够模拟出来的角色进行了安装部署,由于平时工作还是非常忙碌,直到最近才将之前的部署整理成文档,供大家一起参考和学习,本系列没有涉及企业语音的配置,希望大家指出错误和提供建议. 基础架构准备共分为5个部分:1.LYNC2013介绍2.实验环境拓扑介绍3.DNS记录准备4.配置文件共享5.扩展AD架构 一.LYNC2013介绍下面将LY

iOS中Block介绍(一)基础

ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中的使用. AD: 一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block. 二.热身 先看一个比较简单的Block例子: int multiplier =

html基础介绍、基础标签以及文字样式

HTML基本介绍:html作为文件后缀名,就可以让文件变成网页,可以用浏览器所打开:实际,html是一门编程语言,叫做<超文本标记语言>:html的作用,就是制作网页: 标记:html这门语言的基本组成单元 <内容>,大部分都有开始和结束的区别 注意:把文件的后缀名改成doc 就会变成window文件,改成txt,就会变成文本文件 格式:<html> --开始标记 <head></head> --头标记,作用:用来控制网页的布局.编码.特效等内容

VRP平台总体介绍及基础配置

前言 1.VRP软件系统基础 VRP系统在启动时需要加载"系统软件"和"配置文件"两部分,这与其它品牌网络交换机的操作系统是一样的.如果指定了下次启动的补丁文件,还需加载补丁文件.修改VRP系统启动的场景一般有以下几种: a-- 对交换机进行升级操作,即系统软件从低版本至高版本升级 当增加了新特性或者需要对原有性能进行优化以及解决当前运行版本落后的问题时,则需要对交换机进行升级.此时需要加载高版本的系统软件,并重新启动交换机来实现. b -- 对交换机进行降级操作(

【写给小部员的基础微信开发教程2】php介绍及基础

//深夜码字有点困- -. 前言:此为本人所写的第一篇教程,本人将尽可能保证文中相关名词的规范与准确,但由于本人技术知识所限,难免会有所错误,恳请各位读者批评指正,一起交流学习,谢谢. 注:本教程适用于已对 html有基础认知 以及学习过 c++或c或java等编程语言的 同学. 本次教程 php基础 的内容如下: 一.概述 二.应用场景 三.基础语法 以下为正文: 一.概述 php的定义:PHP(Hypertext Preprocessor 超文本预处理器) 是一种创建动态交互性站点的强有力的

iOS开发拓展篇—ReactiveCocoa介绍(基础篇)

1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 2.ReactiveCocoa作用 在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理. 比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式. 其实这些事件,都可以通过RAC处理

【精】表格(UITableView)总结(1):介绍与基础实现

转载请声明出处:http://blog.csdn.net/jinnchang/article/details/45028267 1.表视图(UITableView) UITableView 继承自 UIScrollView.一个表视图可以由多个分段(section)组成,每个分段可以有一个头和尾.很多情况下表视图只有一个分段,而且不显示头尾.表视图本身也可以有一个头(显示在第一个分段之前)和一个尾(显示在最后一个分段之后).一个表视图的整体元素结构示意图如下: (1)表视图风格 UITableV

自动化-python介绍与基础

1.1-python的介绍: 简单点来说吧,python这玩意儿是一个叫做Guido van Rossum的程序猿在1989年的圣诞打发时间而决心去开发的一个脚本编程语言.它之前的名字是以abc语言的一种继承.之所以叫做python,那是因为这个伟大的程序员Guido van Rossum是BBC电视剧--蒙提·派森的飞行马戏团(Monty Python's Flying Circus)的爱好者. 1.2 为什么要学习python: 学习python首先要去了解python是个什么类型的语言,得