Blocks are Objective-C objects, which means they can be added to collections like NSArray or NSDictionary.

Block语法——无参数版本

定义(Block的值)

^{
NSLog(@"This is a block");
}

声明

void (^simpleBlock)(void);

类似int i;

赋值

simpleBlock = ^{
NSLog(@"This is a block");
}

类似i = 2;

声明的时候定义

void (^simpleBlock)(void) = ^{
NSLog(@"This is a block");
}

类似int i = 2;

调用

simpleBlock();

Block语法——带参数版本

定义

^(double firstValue, double secondValue)
{
return firstValue * secondValue;
}

or

^double (double firstValue, double secondValue)
{
return firstValue * secondValue;
}

声明

double (^multiplyTwoValues)(double, double);

赋值

multiplyTwoValues = ^(double firstValue, double secondValue)
{
return firstValue * secondValue;
};

声明的时候定义

double (^multiplyTwoValues)(double, double) =
^(double firstValue, double secondValue)
{
return firstValue * secondValue;
};

调用

double result = multiplyTwoValues(,);

__block修饰符

int anInteger = ;

void (^testBlock)(void) = ^{    //此时只是Block定义,并没有执行里面的函数
NSLog(@"Integer is: %i", anInteger);
}; anInteger = ; testBlock(); //Block调用 输出42

Value is captured when the block is defined.

Block定义的时候,将值复制一份给自己,所以该值已经不受外界影响。

__block int anInteger = ;

void (^testBlock)(void) = ^{    //此时只是Block定义,并没有执行里面的函数
NSLog(@"Integer is: %i", anInteger);
}; anInteger = ; testBlock(); //Block调用 输出84

Because anInteger is declared as a __block variable, its storage is shared with the block declaration.

此时Block里面的值与外面的值共享同一份内存

Block与self的恩怨情仇

It’s important to take care when capturing self because it’s easy to create a strong reference cycle when capturing self.

因为变量默认是__strong修饰(详见这里),所以要时刻注意在block里面对self的引用(只要出现了self关键字就算引用了,因为block会自动capture)

假如self里面定义了一个block,那么self有一个指向block的strong指针(比如该block是self的一个strong成员变量);假如block里面使用了self,则block也默认拷贝了一个指向self的strong指针,此时形成strong reference cycle.

解决方法:在Block前面创建一个__weak类型的指向self的指针,并在block里面使用该指针。

例子

__weak typeof(self) weakSelf = self;    //学习下这种写法哦 typeof(self)
self.simpleBlock = ^{
[weakSelf f];
};
...
self.simpleBlock();

但是,假如Block里面又有一个Block,怎么办?最好是强引用weakSelf,此时strongSelf强引用的是weakSelf而不是self,所以不会形成strong reference cycle

__weak typeof(self) weakSelf = self;    //学习下这种写法哦 typeof(self)
self.simpleBlock = ^{
[weakSelf f];
__strong typeof(weakSelf) strongSelf = weakSelf;
self.simpleBlock2 = ^{
[strongSelf f];
};
self.simpleBlock2();
};
...
self.simpleBlock();

图解

一个函数最好只有一个Block参数,且最好是在最后一个

A Block Should Always Be the Last Argument to a Method.

It’s best practice to use only one block argument to a method.

使用typedef定义一个block

typedef int (^Sum)(int, int);
Sum mySum = ^(int a, int b){
return a+b;
}

or

typedef void (^XYZSimpleBlock)(void);
@property (copy) XYZSimpleBlock blockProperty;

使用copy修饰block的property

@property (nonatomic, copy) Sum mySum;
@property (nonatomic, copy) void (^blockProperty)(void);

非ARC下就必须写copy,because a block needs to be copied to keep track of its captured state outside of the original scope
在ARC下写不写copy都无所谓,so it's a best practice to set copy property for block whether it's ARC or not.

最新文章

  1. 简单学会.net remoting
  2. Blocks_DP&&矩阵快速幂
  3. docker-py的配置与使用
  4. jQuery1.9+中删除了live以后的替代方法
  5. ibatis访问oracle数据库US7ASCII中文乱码问题
  6. javascript动画效果
  7. 【李婶小教程】(SE_lab3)
  8. DESTOON系统文章模块默认设置第一张图片为标题图的方法
  9. SQL Server dbcc checkdb 修复
  10. jQuery的animate在火狐浏览器上不支持backgroundPositionX的解决方法
  11. js1中call和apply的用法
  12. js 捕获浏览器关闭或者刷新页面给出提示
  13. Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程
  14. jsoncpp linux平台编译和arm移植
  15. BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
  16. What Is Apache Hadoop
  17. RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个
  18. a标签置灰不可点击
  19. ReactNative踩坑日志——fetch如何向服务器传递参数
  20. BUCTOJ_ACM2017C 回文串的热爱

热门文章

  1. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
  2. JS open App(未安装就跳转下载页面)
  3. pl/sql死锁oracle
  4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  5. Git版本工具的使用
  6. aehyok.com的成长之路一——开篇
  7. Windows中搭建已存在的Octopress环境
  8. Java关键字--static
  9. Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据
  10. Thinkpad X240使用U盘安装Win7系统