关于 block的一些浅识

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1025. 反转链表 (25)

1025. 反转链表 (25) 时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6…

手机连接电脑win10热点,手机显示无IP分配

hhhh,下面是我从csdn以及百度上查到的,对于我解决这个问题没什么luan用。 在C:\Windows\System32\drivers\etc GitHub不能上,可能我改了host文件的。 //创建一个热点对象 账号为lovely 密码为key netsh wlan set hostednetwork modeallow ss…

设计模式4-创建型模式-Prototype模式

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象。 原型模式的结构比较简单,在使用C实现该模式时重点要注意deep copy和shallow copy的问题。prototype模式在实际使用的过程中,可以通过增加一个原型管理…

JavaIO流加解密,AES对字符串加解密

加解密文件? 哈哈哈哈,当然是为了安全,自己的东西不像让别人看见。 1,学了JavaIO流的字节流的读取写入,便可实现。 加密原理: 把文件读取,然后,按某个特定的规则改变其字节写入一个新文件。 解…

Android--通知之Notification

前言 之前一篇博客讲了Android下使用Toast的方式提示消息。这篇博客讲解一下在Android中使用Notification提示消息给用户,Notification是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。在本篇博客中,将介绍…

1049. 数列的片段和(20)

1049. 数列的片段和(20) 时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CAO, Peng给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1…

UDP协议下的DatagramSocket和DatagramPacket

1,UDP协议? 面向无连接,数据不安全,但速度快。不区分客户端与服务端。 2,实现通信? (三个达到) IP 简单说就是你电脑地址。端口 你电脑里面软件的地址。协议 如何进行通讯。 DatagramSocket 用来发送和接收数据报包的…

使用Log4J监控系统日志邮件警报

使用Log4J监控系统日志邮件警报 前言 在系统上线后,有时候遇到系统故障,这时候就可以登录服务器查看系统日志来排查问题。但是需要登录服务器,下载查找相关异常日志比较麻烦。而且没有监控的话,也无法实时了解到系统是否正常运行。…

1044. 火星数字(20)

1044. 火星数字(20) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue火星人是以13进制计数的: 地球人的0被火星人称为tret。 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, d…

TCP协议下 Socket 与 ServerSocket

不多bb. package c_20_1_5;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socke…

Autodesk的照片建模云服务—Autodesk ReCap 360 photo

现实捕捉技术方兴未艾,简单的讲现实捕捉技术就是把现实中的现状信息数字化到计算机中以便做进一步的处理。对于不同的应用目的会有不同的捕捉设备,工程或传媒娱乐行业中经常用到的肯定就是三维模型了。那如何得到三维模型呢?我们有多种途径和…

1055. 集体照 (25)

1055. 集体照 (25) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在…

线程下的udp和tcp局域网聊天

多线程,继承Thread类,重写run方法。 udp下的聊天。 两方,每一方都可发,可收。 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.…

委托事件实现更新窗体

委托 和 事件在 .Net Framework中的应用非常广泛。 委托( Delegate ):是一种定义方法签名(只有方法的名字,没有方法体),可以与具有兼容的签名的任何方法关联。所谓兼容的方法,是指 这个方法和委托的方法签名具有相同的返回类型和参…

1050. 螺旋矩阵(25)

1050. 螺旋矩阵(25) 时间限制150 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求…

Java多线程,锁(synchronize),饿汉式单例线程,等待处理机制

一,礼让和守护线程 package com.much.hard;public class TestYieldProtect {public static void main(String[] args) {Yield1 y1 new Yield1();y1.setName("A");Yield2 y2 new Yield2();y2.setName("B");//y1.start();//y2.start();Daemon1…

升级ADT22.6后,Android模拟器无法创建

这 两天,在社区里看到有小伙伴们反应,自己在Eclipse下无法创建Android模拟器的问题。起初,自己也没太在意,我一直使用的是 Genymotion模拟器。然后,问题不解决,总有那么一天会让自己碰到的。这不&#xff0…

1052. 卖个萌 (20)

1052. 卖个萌 (20) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手]…