博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC-block
阅读量:7023 次
发布时间:2019-06-28

本文共 2710 字,大约阅读时间需要 9 分钟。

#import 
/* block要掌握的东西 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> 如何利用block封装代码 ^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); }; 3> block访问外面变量 * block内部可以访问外面的变量 * 默认情况下,block内部不能修改外面的局部变量 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 4> 利用typedef定义block类型 typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b) { return a - b; }; MyBlock b3 = ^(int a, int b) { return a - b; }; */typedef int (*SumP)(int, int);typedef int (^MyBlock)(int, int);int sum(int a, int b){ return a + b;}int main(){ // int (*p)(int, int) = sum; // int (*p2)(int, int) = sum; // SumP p = sum; // SumP p2 = sum; /* int (^sumBlock)(int, int); sumBlock = ^(int a, int b) { return a + b; }; int (^minusBlock)(int, int) = ^(int a, int b) { return a - b; };*/ MyBlock sumBlock; sumBlock = ^(int a, int b) { return a + b; }; MyBlock minusBlock = ^(int a, int b) { return a - b; }; MyBlock multiplyBlock = ^(int a, int b) { return a * b; }; NSLog(@"%d - %d - %d", multiplyBlock(2, 4), sumBlock(10 , 9), minusBlock(10, 8)); return 0;}void test3(){ int a = 10; __block int b = 20; void (^block)(); block = ^{ // block内部可以访问外面的变量 //NSLog(@"a = %d", a); // 默认情况下,block内部不能修改外面的局部变量 // a = 20; // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 b = 25; }; block();}// 有返回值、有形参的blockvoid test2(){ /* // 指针函数的指针 int (*p)(int, int) = sum; int d = p(10, 12); NSLog(@"%d", d); */ int (^sumblock)(int, int) = ^(int a, int b){ return a + b; }; int c = sumblock(10, 11); // 用一个block输出n条横线 void (^lineBlock)(int) = ^(int n) { for (int i = 0; i

 

  • Block封装了一段代码,可以在任何时候执行
  • Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
  • 苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多
 

Blocks的定义:

int (^MySum)(int, int) = ^(int a, int b) {  return a+b;};

定义了一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现

Block可以访问局部变量,但是不能修改。

int sum = 10;int (^MyBlock)(int) = ^(int num) {  sum++;//编译报错  return num * sum;};

如果要修改就要加关键字:__block

__block int sum = 10;

 

Blocks和函数指针对比:

  • 定义函数指针   int (*myFn)();
  • 定义Blocks   int (^MyBlocks)(int,int);

 

  • 调用函数指针   (*myFn)(10, 20);
  • 调用Blocks    MyBlocks(10, 20);

 

 

Blocks的赋值

1,在声明的同时定义变量,然后赋值

int (^MySum)(int,int) = ^(int a,int b) {

  return a + b;

};

2,也可先用typedef先声明类型,再定义变量进行赋值

typedef int (^MySum)(int,int);

MySum sum = ^(int a,int b) {

  return a + b;

};

转载于:https://www.cnblogs.com/IDRI/p/4983715.html

你可能感兴趣的文章
KingbaseES的standby搭建
查看>>
Exchange 2010 SP3正式发布提供下载
查看>>
开源跳板机(堡垒机)Jumpserver v0.2.0 部署篇
查看>>
zabbix企业应用之定时获取监控数据做报表
查看>>
微商引流推广方法殆尽,无路可走了吗?
查看>>
height、clientHeight、scrollHeight、offsetHeight区别
查看>>
TKstudio和Adobe Acrobat pro阅读部分快捷键
查看>>
python之sqlite3使用详解(转)
查看>>
Eclipse设立编辑器为绿豆沙颜色
查看>>
遍历Map的四种方法
查看>>
Python天天美味(2) - 字符遍历的艺术(转)
查看>>
getch(),getche(),getchar()的区别
查看>>
文件描述符就绪python模块介绍- select 等待I/0完成
查看>>
星号密码探测工具 - 代码远程线程注入的简单运用
查看>>
时间字符串的转换
查看>>
android sqlite
查看>>
Codeforces Beta Round #18 (Div. 2 Only) C. Stripe 前缀和
查看>>
【ALearning】第二章 Androidproject知识介绍
查看>>
SharePoint 2013 在母版页中插入WebPart
查看>>
CentOs6.5中安装和配置vsftp简明教程
查看>>