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. .NET和Docker ,比翼双飞

    DockerCon 2019本周将在旧金山举行 ,DockerCon 是从业者.贡献者.维护者.开发者和容器生态系统学习.网络和创新的一站式活动. .NET 团队博客发布了<一起使用.NET和D ...

  2. Spring与RMI集成实现远程访问

    使用spring对RMI的支持,可以非常容易地构建你的分布式应用.在服务端,可以通过Spring的org.springframework.remoting.rmi.RmiServiceExporter ...

  3. 2018.7.24 Error Code

    来不及解释了,写下再说 -------------------------------------------- SUCCESS = 0, RTC_SELFTEST_FAILED = 1,      ...

  4. Java实现LSH(Locality Sensitive Hash )

    在对大批量数据进行图像处理的时候,比如说我提取SIFT特征,数据集为10W张图片,一个SIFT特征点是128维,一张图片提取出500个特征点,这样我们在处理的时候就是对5000万个128维的数据进行处 ...

  5. CF 739E Gosha is Hunting

    有 $n$ 个 Pokemon,你有 $A$ 个一类精灵球,$B$ 个二类精灵球 分别给出每个 Pokemon 被这两类精灵球捕捉的概率 求抓到 Pokemon 的最优期望个数 $n\leq 2000 ...

  6. Git 常用命令详解(三)

    转自:http://www.cnblogs.com/1-2-3/archive/2010/07/18/git-commands.html

  7. 利用PIL添加水印

    转:http://www.jb51.net/article/66542.htm

  8. 宝塔中的 base_opendir chattr

    宝塔中的 base_opendir chattr base_opendir 目的是限制一些函数将手乱伸. 而宝塔中的自动配置的是 .user.ini,这个是文件是 +i ............ 这个 ...

  9. demo1 spark streaming 接收 kafka 数据java代码WordCount示例

    1. 首先启动zookeeper windows上的安装见zk 02之 Windows安装和使用zookeeper 启动后见: 2. 启动kafka windows的安装kafka见Windows上搭 ...

  10. appium_python_android测试环境搭建

    第一步  安装appium •Appium是由.NET 开发的,所以,它会依赖 .NET framework相关组件,所以先安装.net framework 4.5,备注: Appium最低支持.ne ...