说起Block在iOS开发中作用非常多,用处也非常广。但要用好Block,确保业务逻辑正常,并且内存管理不出问题,也是不简单的。本篇不再阐述Block的概念和语法用法,就Block访问外部变量和循环引用问题来介绍一下。
一、Block访问外部变量
我们先看一个block访问外部变量的例子:
int a = 10;
void(^myblock)(void) = ^(void) {
NSLog(@"a=%d",a);
};
a = 20;
myblock();
结果会发现打印的 a = 10
而且如果试图在block里修改a的值的话,Xcode就会报错,提示在a的定义前添加__block。
按提示修改代码后发现:
__block int a = 10;
void(^myblock)(void) = ^(void) {
NSLog(@"a=%d",a);
};
a = 20;
myblock();
现在打印的就是 a = 20 了。
这是为什么呢?我们把mian.m文件编译成C++代码看一下到底是怎么实现的:
~/Desktop $ clang -rewrite-objc main.m
得到的main.cpp文件,其中main函数编译成了
int main(int argc, const char * argv[]) {
__attribute__((__blocks__(byref))) __Block_byref_a_0 a = {(void*)0,(__Block_byref_a_0 *)&a, 0, sizeof(__Block_byref_a_0), 10};
void(*