iOS中Block介绍

一、概述

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

二、热身

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

  1. int multiplier = 7;
  2. int (^myBlock)(int) = ^(int num) {
  3. return num * multiplier;
  4. };

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

来,让我们typedef一下

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

三、更详细的例子

注意:上面的typedef都还有效~

主动调用一下:

  1. - (void)someMethod
  2. {
  3. BoolBlock ablock = ^(BOOL bValue) {
  4. NSLog(@"Bool block!");
  5. };
  6. ablock();
  7. }

作为参数返回:

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

类的一个成员:

  1. @interface OBJ1 : NSObject
  2. @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
  3. @end
  4. OBJ1 *obj1 = ...
  5. obj1.block = ^(BOOL bValue) {
  6. NSLog(@"Bool block!");
  7. };

其他函数的参数:

  1. - (void)foo(BoolBlock block)
  2. {
  3. if (block) {
  4. block();
  5. }
  6. }

甚至其他block的参数:

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

啊,全局变量!:

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

好了,你知道block大概能怎么用了。

四,特殊的标记,__block

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

  1. int main()
  2. {
  3. __block int i = 1024;
  4. BoolBlock bBlock = ^(BOOL bV) {
  5. if (bV) {
  6. i++;//如果没有__block标记,是无法通过编译的。
  7. }
  8. };
  9. }

文章出处:http://www.cnblogs.com/shouce/p/5522180.html

时间: 2024-11-06 15:59:00

iOS中Block介绍的相关文章

iOS中Block介绍(一)基础

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

iOS中Block介绍(二)内存管理与其他特性

一.block放在哪里 我们针对不同情况来讨论block的存放位置: 1.栈和堆 以下情况中的block位于堆中: void foo()  {      __block int i = 1024;      int j = 1;      void (^blk)(void);      void (^blkInHeap)(void);      blk = ^{ printf("%d, %d\n", i, j);};//blk在栈里      blkInHeap = Block_cop

iOS 中Block以及Blocks的使用

一.ios中block的使用 Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^(int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,

iOS中block用法之两个界面传值问题

Block的使用有很多方面,其中传值只是它的一小部分,但是很常用更实用,下面介绍Block在两个界面之间的传值用法: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个Label和一个Button,其中Label是为了显示第二个视图控制器传过来的字符串, Button是为了push到第二个界面. 第二个界面的只创建一个TextField,是为了输入文字,当输入文字并且返回第一个界面的时候(第二个视图将要消失的时候),就将这个 TextFiled中的文字传给第一个界面并且显示在

IOS中block的使用方法

X.1 初探Block 在这一小节我们先用一些简单范例来导入block的概念. X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面章节所介绍的简单述句,因为整个定义必须是一个完整的句子,所以必须在最后面加上分号),下面是一个block的范例: 1: int multiplier = 7 ; 2: int (^myBlock)( int ) = ^( int num) 3:

IOS中 Block简介与用法(一)

?Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是"^",接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] vi

iOS中block类型大全

iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调用的block 作为方法返回值的block 作为函数名的block(太过奇葩,完全不知道怎么用-_-!) iOS中block类型大全,码迷,mamicode.com

iOS中block的用法 以及和函数用法的区别

ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的block: int ^(MyBlock)(int,int) = ^(int a,int b){return a+b;} 调用MyBlock(5,6); 将block当作某个类的属性的写法 typedef void (^BlockOption)(); @property (nonatomic,ass

IOS中Block的循环引用

@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"