《Programming with Objective-C》第八章 Working with Blocks
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.
最新文章
- 简单学会.net remoting
- Blocks_DP&;&;矩阵快速幂
- docker-py的配置与使用
- jQuery1.9+中删除了live以后的替代方法
- ibatis访问oracle数据库US7ASCII中文乱码问题
- javascript动画效果
- 【李婶小教程】(SE_lab3)
- DESTOON系统文章模块默认设置第一张图片为标题图的方法
- SQL Server dbcc checkdb 修复
- jQuery的animate在火狐浏览器上不支持backgroundPositionX的解决方法
- js1中call和apply的用法
- js 捕获浏览器关闭或者刷新页面给出提示
- Hibernate(或其它ORM)里的inverse用法详解,内容摘自Java web轻量级开发面试教程
- jsoncpp linux平台编译和arm移植
- BZOJ4025 二分图 分治 并查集 二分图 带权并查集按秩合并
- What Is Apache Hadoop
- RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个
- a标签置灰不可点击
- ReactNative踩坑日志——fetch如何向服务器传递参数
- BUCTOJ_ACM2017C 回文串的热爱
热门文章
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
- JS open App(未安装就跳转下载页面)
- pl/sql死锁oracle
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- Git版本工具的使用
- aehyok.com的成长之路一——开篇
- Windows中搭建已存在的Octopress环境
- Java关键字--static
- Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据
- Thinkpad X240使用U盘安装Win7系统