#import <Foundation/Foundation.h>
// Block块的重定义
typedef int(^aBlock)(int, int);
typedef void(^bBlock)();
// 全局变量
int a = 100;
int main(int argc, const char * argv[])
{
// 定义block
// block类型为有参数有返回值
// int 表示的是返回值,(int,int)表示的是参数类型,MyBlock表示的是block块的名字,^(托字符)的作用是block块的标识符
int(^MyBlock)(int, int) = ^(int a, int b)
{
return a + b;
};
// 调用block
int num = MyBlock(3, 4);
NSLog(@"有参有返回值num ======%d", num);
// 有参数无返回值
void(^MyBlock1)(int, int) = ^(int a, int b)
{
NSLog(@"有参无返回值======%d",a * b);
};
MyBlock1(4, 5);
// 无参数无返回值
void(^MyBlock2)() = ^()
{
NSLog(@"无参无返回值======你瞅啥!!");
};
MyBlock2();
// 无参数有返回值
int(^MyBlock3)() = ^
{
int a = 3;
int b = 5;
int c = a + b;
return c;
};
NSLog(@"无参数有返回值 ======%d",MyBlock3());
// Block与全局变量、局部变量的关系:
// a是全局变量,存放在全局区(静态区);c是局部变量,存放在栈区
NSLog(@"a = %d, 地址:%p", a, &a);
int c = 10;
NSLog(@"c = %d, 地址:%p", c, &c);
void(^myBlock)() = ^()
{
// block里可以访问外面的全局变量,并修改值;也可以访问外面的局部变量,但是不能改值
a = 8;
// a的地址没变
NSLog(@"a = %d, 地址:%p", a, &a);
// 这里c存放在堆区,block内部的局部变量,地址是拷贝过来的,存放在堆区
NSLog(@"c = %d, 地址:%p", c, &c);
};
myBlock();
// 如果想在block内部改变外部的值:
__block int d = 10;
NSLog(@"d = %d, 地址:%p", d, &d);
void(^block)() = ^()
{
d = 12;
NSLog(@"d = %d, 地址:%p", d, &d);
};
block();
NSLog(@"d = %d, 地址:%p", d, &d);
return 0;
}
block
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 简介 block可以当做匿名函数,可以在两个对象间将语句当做数据来进行传递。具有封闭性closure,方便取得上下...
- 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: 首...
- 本章目录 Block截取自动变量 __block说明符 Block存储域 __block变量存储域 Block中截...
- __block修饰对象类型 编译结果: 结构示意图: __block修饰的对象数据类型的变量也能实现block内外...