block的定义:“带自动变量的匿名函数”

(一)写法:

^ void (int iAge){ NSLog(@"%d", iAge);};

和C函数写法区别在于:

1) :以插入符号 ^ 开始.

2):没有函数名字

当block声明变量时候的写法

void (^blk)(int iAge)

block 做函数参数时候

void testFunction:(int)age complete:(void(^)(int iAge))complete{age++;if(complete){complete(age);}
}

(二)block是c语音的扩展,实际上block会被翻译成c语言的static 结构体和static方法,这就是为什么block能截获自动变量的原因。

-(id)init{if (self = [super init]) {int iTmp = 0;^(int i){iTmp = 10;};}return self;
}修改变量编译报错 修改为
-(id)init{if (self = [super init]) {__block  int iTmp = 0;^(int i){iTmp = 10;};}return self;
}

(三)关于block循环引用导致内存泄漏

1):block中使用到类的strong类型变量以及使用到self ,会导致内存泄露。一般解决办法

a:开启ARC 使用__weak 临时变量做转存。

@interface MyTest:NSObject{strong id param;
}- (id)init{if(self = [super init]){^(){NSLog(@"%@", self);NSLog(@"%@", param);//XCode也会报告警告的,提示有循环引用
    }}
}
//修改如下- (id)init{if(self = [super init]){__weak id tmp = param;__weak id selfTmp = self;^(){NSLog(@"%@", selfTmp);NSLog(@"%@",tmp);//XCode也会报告警告的,提示有循环引用
    }}
}

b:若ARC关闭了,可使用__block类型临时变量,再在block中把临时变量赋值为nil,只是必须调用该block,不然一样会内存泄漏

- (id)init{if(self = [super init]){__block id tmp = param;void (^blk)() = ^(){NSLog(@"%@",tmp);tmp = nil;}}
}    

循环引用的原因在于有strong 修饰的自动变量会被复制到堆上,copy.

在关闭ARC,需要手动 Block_copy() block 和Block_relase()

转载于:https://www.cnblogs.com/zhidao-chen/p/3596659.html

关于 block的一些浅识相关推荐

  1. 浅识Flutter 基本组件之TextField组件 输入框decoration属性

    浅识Flutter 基本组件之TextField组件 输入框decoration属性 decoration InputDecoration控制输人框提示信息样式的常用属性 InputDecoratio ...

  2. 浅识Flutter 基本组件Scaffold

    浅识Flutter 基本组件Scaffold 1. body 2. backgroundColor 3. appBar Scaffold是Flutter开发中实现Material Design布局结构 ...

  3. 浅识Flutter 基本组件MaterialAPP的theme属性 app主题

    浅识Flutter 基本组件MaterialAPP的theme属性 app主题 ThemeData属性及描述 设置主题 theme属性用于指定应用程序的主题(即共享颜色和字体样式). 例如,需要将应用 ...

  4. 浅识Flutter 基本组件Scaffold的 drawer属性 app创建头像

    浅识Flutter 基本组件Scaffold的 drawer属性 app创建头像 在项目开发中使用本地图片资源文件的步骤. 1.在项目下创建一个文件夹image 2.将本地图片放入images文件夹里 ...

  5. LPDDR4x 的 学习总结(1) - 存储体的浅识

    验证LPDDR4x 已经有1年,最近把放在onenote的资料整合一下.供后续自己查看,也方便其他有需要的同学上手. 什么是DDR4 ? 第四代双倍速率同步动态随机存取记忆体(英文:Double-Da ...

  6. 安卓开发之路-浅识Android

    1.首先从视觉上感受下安卓系统结构 可以发现安卓系统的底层是linux内核 依次往上分别是系统运行库层 应用框架层 应用层 蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机(这里是优 ...

  7. J2EE总结--浅识JNDI

    最近一直在对J2EE的笔记进行整理和复习,虽然J2EE视频是看过一遍了,但是当我看自己做的笔记的时候陌生程度还是很大,而真正的对某个概念有所认识的时候是将笔记和以前看过的视频印象进行摩擦,J2EE主要 ...

  8. php mysql 胚子_php mysql数据库连接浅识

    1.连接数据库连接函数: a.mysql_connect()  :函数打开非持久的 MySQL 连接 b.mysql_pconnect() :函数打开持久的MySQL 连接 mysql_connect ...

  9. java_vinson_04:String类浅识

    String testStr = "This is a java's testString"; 1.java中的String并不是一个基本数据类型,而是一个对象类: 2.实用sub ...

最新文章

  1. 删除本地git的远程分支和远程删除git服务器的分支
  2. java example cat_java maven hello example
  3. 高速行车12条技巧,每一条都关乎你的生命
  4. nginx下gzip配置参数详解
  5. 函数 over() 的含义
  6. HTML5期末大作业:个人网页设计——薛之谦6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
  7. 融合通讯四大关键词和三个应用场景
  8. Expected response code 250 but got code “501“, with messa php laravel 发邮件 smtp qq邮箱 阿里云
  9. 换个好看舒服的jupter notebook风格
  10. Knockout.js的简单使用
  11. 私有文件服务器,私有云文件服务器
  12. React Native关于使用CameraRoll出现的问题@react-native-camera-roll/camera-roll@react-native-community/cameraro
  13. 社区医院信息系统的设计与实现
  14. 当我去了不到 20 人的 IT 公司后。。。
  15. Codeforces Round #529 (Div. 3) F(kul最小生成树)
  16. 什么是营销自动化工具?简单的营销自动化流程如何设计?
  17. 微信小程序报错 net::ERR_CONNECTION_TIMED_OUT
  18. 利用双栈法实现简易计算器
  19. 中国智能电动车“登陆”韩国;特斯拉车主将车钥匙芯片植入手臂;日本研究用卫星“太空放牛” | 每日大事件...
  20. Mac官网下载安装clion后打不开

热门文章

  1. 前端学习(3251):样式的模块化
  2. 前端学习(3038):vue+element今日头条管理-使用请求拦截器
  3. 前端学习(2979):vue-element-admin结构
  4. [html] 如何让pre标签中的元素自动换行?
  5. [css] ui设计中px、pt、ppi、dpi、dp、sp之间的关系?
  6. 前端学习(1715):前端系列javascript之页面配置
  7. 第一百二十一期:当新闻报道用上AR 技术,能为读者带来什么?
  8. 第五十五期:MongoDB数据库误删后的恢复
  9. 第四十一期:一道经典的MySQL面试题,答案出现三次反转
  10. java学习(5):全局变量和局部变量