OC 中关于block使用的简单举例说明
来源:互联网 发布:网络教育的利弊 编辑:程序博客网 时间:2024/05/17 21:51
block 也被称为代码块,有时亦被称为闭包,其使用方法很像 C 语言的指针
一.与 C 语言的对比
C: void (* myPointer) (void);
block: void (^myBlock) (void);
block 只需要将*号换成^号即可
二.block的声明及使用
1.无参无返回值
int main(int argc, const char * argv[]) { @autoreleasepool { void (^myBlock)(void) = ^(void) { NSLog(@"this is a block"); }; myBlock(); } return 0;}
2015-11-15 11:00:12.325 block[740:27832] this is a block
无参数的时候 void 可以省略,无论是声明的时候还是使用 block 的时候
2.有参无返回值
int main(int argc, const char * argv[]) { @autoreleasepool { void (^myBlock)(int,int) = ^(int a, int b) { NSLog(@"a + b = %d",a + b); }; myBlock(1,1); } return 0;}
2015-11-15 12:06:12.698 block[1048:48065] a + b = 2
3.有参有返回值
int main(int argc, const char * argv[]) { @autoreleasepool { int (^myBlock)(int,int) = ^(int a, int b) { return a + b; }; int c = myBlock(1,1); NSLog(@"a + b = %d",c); } return 0;}
2015-11-15 12:09:09.157 block[1061:49878] a + b = 2
4.采用 typedef 方法声明 block
typedef void (^Myblock) (int,int);int main(int argc, const char * argv[]) { @autoreleasepool { Myblock blocks = ^(int a, int b) { NSLog(@"a + b = %d",a + b); }; blocks(1,1); } return 0;}
2015-11-15 12:10:19.311 block[1071:50640] a + b = 2
声明之后就可以用”MyBlock”作为一种数据类型的方式来使用了(类似 int a 这种方式)
三. 关于 block 内部使用的变量问题
1.声明的变量为局部变量
int main(int argc, const char * argv[]) { @autoreleasepool { int a = 10,b = 10; int (^myBlock) () = ^() { return a+ b; }; int c = myBlock(); NSLog(@"a + b = %d", c); a = 20; b = 20; c = myBlock(); NSLog(@"a + b = %d", c); } return 0;}
2015-11-15 11:25:27.892 block[893:34865] a + b = 202015-11-15 11:25:27.894 block[893:34865] a + b = 20
可以看到两次输出的结果都是20,即使我们修改了 a 和 b的值
这个问题可以这样理解,我们在创建了 block 的时候,这段代码并没有执行, block 只有在调用的时候才会去执行代码块里面的内容,因为声明的 a和 b 的变量是局部变量,在调用 block 的时候,只会读取到 a和 b 都为10 的值
想要解决这个问题我们可以将局部变量改为全局变量,静态变量也是同理
2.声明的变量为全局变量或静态变量
int a = 10,b = 10;int main(int argc, const char * argv[]) { @autoreleasepool { int (^myBlock) () = ^() { return a+ b; }; int c = myBlock(); NSLog(@"a + b = %d", c); a = 20; b = 20; c = myBlock(); NSLog(@"a + b = %d", c); } return 0;}
2015-11-15 11:37:15.019 block[926:37464] a + b = 202015-11-15 11:37:15.020 block[926:37464] a + b = 40
3.在 block 中改变参数
block 虽然可以读取 block 外部的值,但是却无法修改.因为 block 是将变量的值 copy 一份然后读取,因而想要在 block 内部修改传进来的参数,要在声明变量的时候在前面加上__block
int main(int argc, const char * argv[]) { @autoreleasepool { int b = 10; __block int a = 10; int (^myBlock) () = ^() { a += 10; return a+ b; }; int c = myBlock(); NSLog(@"a + b = %d", c); a = 20; b = 20; c = myBlock(); NSLog(@"a + b = %d", c); } return 0;}
2015-11-15 11:47:48.057 block[1002:41160] a + b = 302015-11-15 11:47:48.058 block[1002:41160] a + b = 40__block就相当于给变量赋予了一个指针,这样在 block 中使用的时候,传过来的不再是变量的copy值,而直接传递过来的是变量的地址,这样我们就可以直接修改数据本身,在调用过 block 之后再去读取变量a 的值,也会发现 a 的值已经发生了变化
注:该问题的警告是Variable is not assignable(missing __block type specifier)
0 0
- OC 中关于block使用的简单举例说明
- OC block的简单使用
- OC-简单的使用BLOCK
- OC中Block的使用
- OC中Block的使用
- oc block简单使用
- 【OC语言】关于block的使用
- 关于block的OC
- oc中block的定义和使用
- OC的Block中使用weakSelf/strongSelf
- OC中block的使用及注意
- oc block的使用
- OC--Block的使用
- 个人对于OC中delegate、block的简单理解
- iOS 关于block的简单使用
- oc中block的理解
- OC------block块的使用
- OC之Block的使用
- linux下安装jdk
- 九度oj-1041-Simple Sorting
- Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法
- 芯片封装
- 012-游戏物体与组件 srt字幕文件
- OC 中关于block使用的简单举例说明
- redhat6.5 配置使用centos的yum源
- 多选标签 用到jQuery
- 013-属性编辑器的使用 srt字幕文件
- 初学Android项目:开发电子市场<第二天>上
- 014-场景视图操作 srt字幕文件
- 015-灯光和摄像机 srt字幕文件
- 016-脚本及变量 srt字幕文件
- Genymotion win10安装