文档章节

Block的循环引用

余成海
 余成海
发布于 2016/08/30 12:12
字数 507
阅读 71
收藏 0
点赞 0
评论 0

在ios常见的循环引用中曾经提到过block:

看看上面最基本的block循环应用,self包含block,block包含了self中的变量val,所以形成了循环应用,编译器给出了循环引用的警告,当然不是所有的block循环引用编译器都能给出警告,所以不要只依赖编译器的警告来判断循环引用,如:

解决的办法当然是使用__weak来修饰self

__weak typeof(self) weakSelf = self;
blkk =  ^{
    [weakSelf showLog];
};
blkk();

-------------------------------凌乱分割线-------------------------------

正常在栈上的block引用self是不会引起循环应用的,所以可以不使用weak来修饰self

void (^blkk)(void) =  ^{
    [self showLog];
};
blkk();

但是因为block的使用附有__strong的原因,虽然不会有循环引用,但是也会起到延长self对象的生命周期的效果,直到栈上的block释放了,才会释放self。

因此释放self可能会让程序出现问题,假如self监听了某些通知而修改公共资源什么的,所以这种情况下最好也使用weakself。

当然你也可能不希望self提前释放,因为你的block回调后需要进行完整操作,假如self释放了,你无法在block回调后来处理一些其他的事情,这时候你可以选择不使用weakself,也可以使用weakself+strongself。先看看weakself+strongself的写法:

__weak __typeof__(self) weakSelf = self;

createdTask = [self.sessionManager
              dataTaskWithRequest:request
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
              dispatch_async(self.responseQueue, ^{
                  __strong __typeof__(weakSelf) strongSelf = weakSelf;
.....

上面是AFNetworking的源码,在block前用了weakself,在block里用了strongself,这样做和直接不使用weakself有什么区别呢。

  block回调前结束self block回调后结束self
不使用weakself self 不释放 self不释放
weakself+strongself self已释放 self不释放
使用weakself self已释放 self已释放

所以根据情况的不同,大家可以选择使用哪种方式。当然最无脑的推荐还是使用weakself

© 著作权归作者所有

共有 人打赏支持
余成海
粉丝 61
博文 57
码字总数 29577
作品 0
杭州
iOS工程师
如何优雅的处理循环引用(retain cycle)

什么是循环引用? 顾名思义, 就是几个对象某种方式互相引用, 形成了"环"。由于 Objective-C 内存管理使用引用计数的架构, 而并不是 GC(garbage collector), 而在 ARC(自动引用计数) 下所有 OC...

__block
06/13
0
0
iOS 面试题~避免循环引用~解决方法

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、概念: 循环引用:指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 其实循环引用...

石虎132
2017/12/22
0
0
ios block常见的错误(二)——循环引用

这篇博文继续block的常见错误——循环引用。 循环引用是很多初学者不能察觉的,其产生的原因,是block中的代码会对对象进行强引用。 读者请阅读示例代码1,并思考示例代码1所创建的对象能否被...

北方人在上海
2015/11/12
0
0
ios-常见的循环引用

介绍: 循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 举个例子:A->B->C->....->X->B ->表示强引用,这样的B的引用...

余成海
2016/04/12
1K
0
iOS 面试全方位剖析 -- Block篇

block 介绍 截获变量 block修饰符 Block的内存管理 Block的循环引用 截获变量 先看一个问题 带着问题往下看,有这几种类型的变量 从这段代码来深入了解一下 使用 clang命令看一下编译后的源码...

PetitBread
05/28
0
0
(iOS)如果你使用过block,最好看一下这篇文章

首先,本文并不会涉及太多block的源码,更多的是block使用方面的一些东西。 新人写文,如有错误,敬请斧正! 原理 使用也好认识也好,首要任务就是搞懂block到底是个什么东西,其中的内容我们...

Perfect_dream
2017/11/24
0
0
iOS 解决闭环引用问题

什么是闭环引用: 所谓闭环引用是2个货2个以上的相互关联的类的对象互相引用,造成了一种引用闭环问题,这种引用造成的问题是闭环内的所有对象都无法及时销毁,这种问题不是Objective-C和Swi...

IamOkay
2016/03/26
504
0
iOS开发——Block引起循环引用的解决方案

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题。今天我们主要来讲讲Block中涉及的循环引用问题。当我们自己一开始写代码的时候,可能会大量在block中使用...

hejunbinlan
2016/06/01
55
0
在block中使用self怎么避免循环引用

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题。今天我们主要来讲讲Block中涉及的循环引用问题。当我们自己一开始写代码的时候,可能会大量在block中使用...

小王爷还小
2016/12/22
20
0
iOS中Block循环引用刨根问底

序言 Blocks是苹果出的轻量型回调方式,使用起来既简洁,又方便。不过就是会产生一个问题:循环引用。进而会导致内存释放不了,造成内存泄漏。那到底怎么样才会产生循环引用呢?如何解决呢? ...

FlyOceanFish
05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Unity客户端框架

自己作为主力开发的第一个Unity项目已经进入尾声测试阶段了,虽然数据还没有完全达到要求,但是从代码层面上看,有很多地方已经可以进行总结和整理。不管项目最终结果如何,在整个开发过程中...

爽歪歪ES
8分钟前
0
0
数据分析挖掘学习干货:大数据处理技术的总结与分析

一 数据分析处理需求分类 1 事务型处理 在我们实际生活中,事务型数据处理需求非常常见,例如:淘宝网站交易系统、12306网站火车票交易系统、超市POS系统等都属于事务型数据处理系统。 这类系...

加米谷大数据
11分钟前
0
0
关于看到的从页面调取html或者接口

你看到的可能是路由或者进行的接口拦截的跳转而不是前端页面进行的跳转

凡人修仙者
15分钟前
0
0
Ubuntu 安装 Redis (非源码Build方式)

安装redis : apt-get install redis-server # 安装完会自动自动 使用命令 ps -aux|grep redis 查看是否启动 ---------------------------------- redis 服务操作方式 /etc/init.d/redis-serv......

Alex142857
19分钟前
0
0
mysql字段中去掉括号

eg: select * from (select *,substring_index(substring_index(remarks,"[",1),']',-1) as carCard from test ) as t where carCard LIKE '%C999%'...

writeademo
22分钟前
0
0
web3.py简介

与web3.py库交互的共同入口是web3对象。web3对象提供API,用于python开发的应用与以太坊区块链进行交互,通常是通过连接JSON-RPC服务器进行。 Providers提供者 Providers使web3连接到区块链上...

笔阁
23分钟前
0
0
jquery 获取父页面某一个input框值得写法

//login_name 为父页面的input框的ID var login_name= $('#login_name', window.parent.document).val();//当前用户登录名...

gulf
25分钟前
0
0
mybatis高级查询

说实话不怎么想写这些,可能是我昨天太累了,妹的那个错误一直找不到。醉了,写一下把,分别是多表联合查询以及汇总 <resultMap id="mdxlResult" type="java.util.Map"> <id column="id" ...

木九天
27分钟前
0
0
Spring5(Java8版本)中的反射工具类和注解工具类

1.反射工具类 学习反射时很好的反射教程.这个工具类是基于Java8的。 package org.springframework.util;import java.lang.reflect.Constructor;import java.lang.reflect.Field;imp...

hutaishi
29分钟前
0
0
java io

Java IO在实际开发中的应用 http://www.cnblogs.com/ldh-better/p/7158658.html

小鱼吃大鱼
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部