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 = ;
^(int i){
iTmp = ;
};
}
return self;
} 修改变量编译报错 修改为
-(id)init{
if (self = [super init]) {
__block int iTmp = ;
^(int i){
iTmp = ;
};
}
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()

关于 block的一些浅识的更多相关文章

  1. javascript原型prototype浅识

    C++,java是基于类的语言,主要通过类来实现继承. javascript是基于原型的语言,通过原型来实现继承. 什么是原型?每种物质,都可以追根溯源,原型就是对象的根源.继承就是追根溯源. jav ...

  2. 字符编码浅识:关于Unicode与UTF-8

    参考自阮一峰博客:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html Unicode只是一个符号集,它只规定了符号的 ...

  3. 新手对css的浅识

    对于css的一个初步理解与认识 在最近的学习中接触到了之前自己从来都不曾想过的语言,C语言,html超文本标记语言等等,还有今天在这里我要进行分析的css,之前浏览过很多的网页,也曾想过这里面的秘密, ...

  4. HTML浅识

    HTML相关======= ## 认识网页 *web标准(w3c三种标准):结构标准 -->html 表现标准 -->css 行为标准 -->js **浏览器和服务器:浏览器发送报文 ...

  5. web前端的发展态势 浅识

    以前 作为一个java程序员写的代码主要还是后台的代码,虽然开始的时候前后端都写,但是也是用别人造好的轮子来用,学学html,css,js,jquery,再找一个前端ui框架学学,上手之后我们就可以写 ...

  6. Android FrameWork浅识

    接收讯息及事件 储存共享数据 处理UI互动的事情 幕后服务(播放背景音乐) 在框架的手中,它的生命的周期完全由框架来控制,new也是由框架.它的逻辑调用则是自己实现,确保强龙的地位 框架反向来控制相应 ...

  7. Vue-router浅识

    一.router-link及router-view :用来做导航,通过传入to属性来指定链接 :用来做路由出口,路由匹配到的组件都会渲染在这里 const router = new VueRouter ...

  8. 浅识J2EE十三个规范

    前言 没有规矩不成方圆,学习J2EE,先来明白都有什么规范. 内容 1.JDBC(Java Database Connectivity)java数据库连接 a)为java开发人员提供了一个行业标准AP ...

  9. 浅识MySQL

    MySQL常用语句 #操作数据库 ##创建数据库 CREATE DATABASE `dbName`; ##切换数据库 USE `dbName`; ##查看所有数据库 SHOW DATABASES; # ...

随机推荐

  1. EF 连接oracle 基础连接失败 问题解决

    以此记录今天犯下的错误:

  2. 原生JDBC的使用

    public class ConnDB { private Connection ct = null; //驱动程序名 String driver = "com.mysql.jdbc.Dri ...

  3. 手动安装mysql-5.0.45.tar.gz

    Linux下编译安装 安装环境:VMware9(桥接模式) + Linux bogon 2.6.32-642.3.1.el6.x86_64(查看linux版本信息:uname -a) 先给出MySQL ...

  4. 深入探索C++对象模型 读书笔记

    第1章 关于对象 1.C++在布局以及存取时间上的主要的额外负担是由virtual引起的,包括: a.virtual function机制,引入vptr以及vtbl,支持一个有效率的"执行期 ...

  5. UVA - 1610 Party Games (字符串比较)

    给你n(n为偶数)个字符串,让你找出一个长度最短且字典序尽量小的字符串,使得一半的字符串小于等于该串,一半的字符串大于该串. 紫薯上说这道题有坑,但其实思路对了就没什么坑. 很明显,只要取夹在中间两个 ...

  6. ENTRYPOINT 与 CMD

    在Dockerfile中 ENTRYPOINT 只有最后一条生效,如果写了10条,前边九条都不生效 ENTRYPOINT 的定义为运行一个Docker容器像运行一个程序一样,就是一个执行的命令 两种写 ...

  7. an easy problem(贪心)

    An Easy Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8333   Accepted: 4986 D ...

  8. kali_linux学习笔记

    kali linux ssh登陆: 一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 将#PasswordAuthentication no ...

  9. Web打印的处理 方案之普通报表打印

    做过许多 的Web项目,大多数在打印页面内容的时刻 ,采用的都是议决 Javascript调用系统内置的打印要领 执行 打印,也就是调用 PrintControl.ExecWB(?,?)实现直接打印和 ...

  10. VS2005环境下的DLL应用

    VS2005环境下的DLL应用 作者:一点一滴的Beer http://beer.cnblogs.com/ 以前写过一篇题为<VC++的DLL应用(含Demo演示)>的文章,当时是刚开始接 ...