最近碰到不少关于block的相关问题,在此做一些总结。

1.基本形式

返回值类型(^block)(形参列表)= ^(形参列表列表){代码段;};
eg: int(^block)(int,int) = ^(int i, int j){return i + j;};

定义没有参数的三种写法:
当没有形参时,左边形参列表括号必须写,右边可写可不写,左边形参类型可写可不写;
void(^block)() = ^(){};
void(^ block)() = ^{};
void(^ block)(void) = ^{};

typedef定义Block类型

typedef int (^Block)(int, int);
//加上typedef之后,Block不再是一个变量,而是一个数据类型
Block b1, b2;
//使用typedef声明的变量类型定义另个变量

2.块对象作形参和块对象作函数返回值

void fun(int (^b)(int x, int y))
{  NSLog(@"b(3, 4) = %d", b(3, 4)); //在fun函数内部调用代码块,并传参。
}int main()
{  //1,直接在实参位置定义block代码块,这时候 如下的 int 表示代码块的返回值类型,可以写可以不写,不写的时候,程序会根据形参的返回值类型做类型转换,一般情况这里还是写返回值类型为好,避免不必要的错误。  fun(^int(int x, int y) {  return x + y;  });  //2,先定义一个block代码块,再将代码块类型的变量作为实参传给fun函数。  int (^block)(int, int) = ^(int a, int b){  return a * b;  };  fun(block);  

3.块对象中的变量行为

1)在block代码块内部可以访问定义的全局变量,局部变量,静态局部变量,但是访问局部静态变量时候是只读的并且局部变量和在代码块中访问到的不是同一个地址的变量,他们在数值上相等,互相似乎没什么联系。 因为代码块中使用到局部变量的时候,会将局部变量进行const类型的copy,所以在代码块中访问到的局部变量都是只读的;静态变量和全局变量都存放在静态区,在程序运行过程中都存在,他们可以在不同的代码块中共享,不同代码块中访问到的同一个全局变量,局部变量是同一块内存的数据;对于普通局部变量在代码块中只读,全局变量和静态局部变量在代码块中可以读写。
2)在块句法的主体中,除块句法内部的局部变量和形参之外,还包含块句法当前位置处可以访问的变量;这些变量中包含外部变量也包含块中可以访问的局部变量。
3)代码块中访问局部变量时候,局部变量会从栈内存被const类型的copy一份到堆内存中。
4)块对象和函数指针的定义使用功能都差不多,块对象的精髓之处就在于,在块对象中可以访问到上下文的变量,而函数指针不能

4,块对象的实例和生命周期
1)块句法也可以写在函数的外部,当写在函数外面时候,只是在静态数据区分配一块内存给块对象,这块区域在程序执行期间会一直存在。
2)块句法写在函数内部的时候,块对象和变量的生命周期和普通局部变量一样,块对象的内存区域会在执行包含块对象的函数时保存在栈上;该块对象的生命周期就是函数运行期间。
3)在现实的实现中,当函数内的块语法不包含自动变量的时候,就没必要进行复制值,所以块对象的内存区域也会被保存在静态数据区。
4)block代码块被保存在堆或者静态区中,不会被保存在栈中,如下图可以说明这一点。

5,块对象的复制
函数内的块对象和局部变量的生命周期相同,都只是在函数的执行期间。但是在函数的方法调用参数中直接代入块对象也是块对象的一种非常常见的用法,这时候使用与函数调用关系或栈状态无关的块对象是非常必要的。
有一个函数可以复制块对象到新的堆内存,通过使用该函数,即使是在函数内部定义的块对象也能独立于栈被持续的使用,此外还有一个函数可以释放不需要的块对象。
Block_copy( block )
参数为栈上的块对象的时候,返回堆上的块对象。参数为堆上的块对象或者静态区的块对象,不进行复制,直接返回原对象,但是会增加参数块对象的引用计数。
Block_release( block )
减少参数块对象的引用计数。当引用计数减到0时候,块对象被释放。
Eg:
a = Block_copy(block);
Block_rlease(a);

6.指定特殊变量 __block
ARC环境下

非ARC环境下

7.Block传值示例及注意事项

detailView页面是第二层页面,此处是从下级往上级传值DetailViewController.h
typedef void (^BLOCK)(NSString * string) ;//block的声明
@property (copy ,nonatomic)BLOCK  block;DetailViewController.m
-(void)viewDidDisappear
{
self.block(self.textField.text);//传值
}SecondViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
DetailViewController * detailVC = (DetailViewController*)segue.destinationViewController;//block赋值
__block SecondViewController * secondVC = self;//防止循环使用
detailVC.block = ^void(NSString * string){
secondVC.navigationItem.title = string;
};//注意分号
}

1.block没有层级限制,可以从下往上,也可从上级往下级传
2.block不容易找到实现方法的地方
3.声明block属性时用copy修饰

iOS之block基础及传值相关推荐

  1. iOS Core Bluetooth 基础知识

    原文:The Utimate Guide to Apple's Core Bluetooth – PunchThrough 本文假设您了解蓝牙低能耗(BLE)和iOS编程的基础知识(包括许多iOS原生 ...

  2. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础-手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  3. IOS UI开发基础之超级猜图完整版本-08

    IOS UI开发基础之超级猜图完整版本-08 // // ViewController.m // 09-超级猜图 // // Created by 鲁军 on 2021/1/31. //#import ...

  4. iOS Core Bluetooth_2 基础知识

    章节连接 iOS Core Bluetooth_1 概述 iOS Core Bluetooth_2 基础知识 iOS Core Bluetooth_3 用作中央设备的常用方法(1/2)[swift实现 ...

  5. iOS战记 ----OC基础语法之战(一)

    iOS战记  ----OC基础语法之战(一) 一个机械设计者的转行之战. 火车一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面 ...

  6. 苹果8plus什么用计算机,【苹果iPhone8Plus评测】iOS 11:基础分满分后它要做附加题-中关村在线...

    iOS 11:基础分满分后它要做附加题 iOS 11:基础分满分后它要做附加题 每次新的iPhone发布的日子,也是iOS系统重大更新的日子.正是因为这一策略,让使用不同iPhone手机用户对于新系统 ...

  7. iOS中Block的基础用法

    原文链接:http://www.jianshu.com/p/17872da184fb 本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Blo ...

  8. iOS:使用block进行类与类,控制器与控制器之间的传值

    介绍:在iOS中类与类,控制器与控制器之间传值的方式有多种,分别是:单例传值.代理传值.通知传值.block传值或者一些偏好设置也可以用来传值.... 每一种传值方式都有各自的优点和缺点,针对不同情况 ...

  9. iOS 页面间几种传值方式(属性,代理,block,单例,通知)

    第二个视图控制器如何获取第一个视图控制器的部分信息 例如 :第二个界面中的lable显示第一个界面textField中的文本 这就需要用到属性传值.block传值 那么第一个视图控制器如何获的第二个视 ...

最新文章

  1. ubuntu 安装php-redis
  2. 进程与线程 thread (二)——线程概念
  3. Android Annotations配置与使用
  4. Webservice入门教程_用CXF编写基于Spring的WebService
  5. android浮于上方布局,android-在FrameLayout中使RecyclerView上方的视图...
  6. Session过期,如何跳出iframe框架页的问题
  7. 【华为云技术分享】《跟唐老师学习云网络》— Ping喂报文
  8. scala spark 数据对比_Spark 实践——用 Scala 和 Spark 进行数据分析
  9. 办公软件excel表格_EXCEL表格模板下载推荐?办公资源网优质海量素材资源免费下载...
  10. 想做个磁力链搜索引擎 3
  11. Linux软件更新与安装
  12. 测试用例(功能用例)——资产类别、品牌、取得方式
  13. AcWing 658. 一元二次方程公式
  14. oracle中间人投毒漏洞,‘TNS Listener’远程数据投毒漏洞
  15. [Irving]SQL去重复-DISTINCT用法
  16. 新员工转正述职报告PPT模板
  17. matlab计算高斯分布函数,MATLAB如何使用normcdf函数计算正态分布的累积概率
  18. 关于Arduino、树莓派和 Pixhawk微处理器对比分析
  19. 关于使用LocationManager时遇到的问题
  20. 对数据库某个字段进行去重

热门文章

  1. 2021年度中国民营物流企业50强排行榜:上海上榜企业最多,顺丰再度蝉联榜首(附年榜TOP50详单)
  2. 使用Mathtype的“插入下一章”导致整个自动生成的目录出现难看的章节号
  3. 实现memset函数
  4. vue根据接口返回数据状态给按钮动态设置disabled属性
  5. kali怎么设置成中文
  6. TDD测试驱动开发一
  7. 2019一键清空朋友圈_2019即将结束说说朋友圈 2019即将结束朋友圈句子
  8. DWG to SVG
  9. C++ STL容器 —— map/multimap 用法详解
  10. 【Maven】pom.xml教程