ios 修复 内存泄露_iOS最强大的定位内存泄露工具_好奇心研究所的博客-程序员资料

技术标签: ios 修复 内存泄露  

以下原代码是使用MLeaksFinder定位到报错的代码,纠正后为不存在泄露的代码

原代码一:

UIButton *btn = [self createBtnWithTitle:title];

/*! 监听点击事件 */

[btn bk_whenTapped:^{

int tag = (int)btn.tag;

self.selectedBtnType = tag;

self.clicked(tag);

}];

纠正后:

int tag = (int)btn.tag;

/*! 监听点击事件 */

__weak typeof(self) weakSelf = self;

[btn bk_whenTapped:^{

weakSelf.selectedBtnType = tag;

weakSelf.clicked(tag);

}];

原代码二:

[_shareBtn bk_whenTapped:^{

_shareClicked();

}];

纠正后:

__weak typeof(self) weakSelf = self;

[_shareBtn bk_whenTapped:^{

weakSelf.shareClicked();

}];

原代码三:

[_rightBackBtn bk_whenTapped:^{

[self.viewController.navigationController popViewControllerAnimated:YES];

}];

纠正后:

[_rightBackBtn bk_whenTapped:^{

[weakSelf.viewController.navigationController popViewControllerAnimated:YES];

}];

原代码四:

__weak typeof(self) weakSelf = self;

[propertyView addObserverBlockForKeyPath:@"selectedSku" block:^(__weak id obj, ALGoodsSKUItem *oldItem, ALGoodsSKUItem *newItem) {

if (![newItem.SKUID isEqualToString:oldItem.SKUID]) {

_currShowSkuItem = newItem;

weakSelf.requestActivityData();

}

}];

纠正后:

__weak typeof(self) weakSelf = self;

[propertyView addObserverBlockForKeyPath:@"selectedSku" block:^(__weak id obj, ALGoodsSKUItem *oldItem, ALGoodsSKUItem *newItem) {

if (![newItem.SKUID isEqualToString:oldItem.SKUID]) {

weakSelf.currShowSkuItem = newItem;

weakSelf.requestActivityData();

}

}];

原代码五:

/*! 监听address的frame,当需要显示身份视图的时候修改其他视图的位置 */

/*! headerTitleView/headerView/headerTitleView/addressView 都是局部对象变量 */

__weak typeof(self) weakSelf = self;

[self.addressView addObserverBlockForKeyPath:@"frame" block:^(__weak id obj, id oldVal, id newVal) {

headerTitleView.top = addressView.bottom;

headerView.height = headerTitleView.bottom;

weakSelf.tableView.tableHeaderView = headerView;

}];

纠正后:

/*! 监听address的frame,当需要显示身份视图的时候修改其他视图的位置 */

/*! headerTitleView/headerView/headerTitleView/addressView 都是局部对象变量 */

__weak typeof(self) weakSelf = self;

__weak typeof(headerTitleView) weakHeaderTitleView = headerTitleView;

__weak typeof(addressView) weakAddressView = addressView;

__weak typeof(headerView) weakHeaderView = headerView;

[self.addressView addObserverBlockForKeyPath:@"frame" block:^(__weak id obj, id oldVal, id newVal) {

weakHeaderTitleView.top = weakAddressView.bottom;

weakHeaderView.height = weakHeaderTitleView.bottom;

weakSelf.tableView.tableHeaderView = weakHeaderView;

}];

总结:这个地方我调试了很久,有用过__block来修饰局部对象,不起作用,这里贴上__block和__weak的区别

*__block和__weak的区别:

1.在MRC环境下,block是弱引用,在ARC环境下是强引用

2.block本身无法避免循环引用的问题,但是我们可以通过在 block 内部手动把 blockObj 赋值为 nil 的方式来避免循环引用的问题。另外一点就是 block修饰的变量在 block 内外都是唯一的,要注意这个特性可能带来的隐患。

3.weak本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个strong的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题。

原代码五:_mainView = self.superview; /*! _mainView为成员变量 */

纠正后:

去掉_mainView的变量,用到_mainView的用self.superview代替就解决了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29767975/article/details/113010951

智能推荐

网上在线字典辞典大全_msnetc的博客-程序员资料

  翻译类字典辞典 英汉类字典辞典 金山词霸2006在线版 ——

解决ie关于css var的适配问题_小幽艾的博客-程序员资料_css var 兼容性

方案通过webpack的postcss-loader+postcss-css-css-variable编译生成固定的代码例如::root { --white: #fff; --black: #000;}a { border: 1px solid var(--white);}span { color: var(--black);}通过webpack的pos...

MyBatis源码的学习(15)---sqlSession.selectList方法_itw_zhangzx02的博客-程序员资料_etsqlsession() .selectlist

sqlSession一共俩个实现类,我们这里分析默认的DefaultSqlSession类public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { try { //ms对象代表我们的xml中的一条sql。例如:<select...

最强Android教程!掌握这些Android开发热门前沿知识,赶紧收藏!_左夜天的博客-程序员资料_android 实用前沿技术

前言这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。欢迎一线公司员工以及网友提交面试题库,欢迎留言。网上的都是按照公司划分的,想找具体某一方面的知识点有点不好找,我这里就根据知识点分门别类的整理了一下,想看哪一块可以快速找到。阿里巴巴面试问题还记得一些,一部分已经忘记了,为了防止再忘记,所以写出来。1:你是如何理解Android操作系统的。2:是否熟悉framework层,如果熟

revit 转换ifc_导出 IFC 文件以使用 BIM 软件进行编辑_瑞士鲁迅的博客-程序员资料

内容在编辑 BIM IFC 文件之前,了解 Revit 导出设置。用户建筑师、工程师、设计师、项目经理、BIM 经理。方法1. 定义要导出的图元在 Revit 项目中,定义专用于导出 IFC 文件的三维视图。在此视图中,您可以控制对编辑文件的团队成员可见的图元。请勿包含编辑软件不支持的类别,例如 HVAC 图元。最好在协调模型中共享这些类别。2. 检查 IFC 导出映射文件选择“文件”>“导...

linux系统实验shell程序设计,实验三-shell脚本程序设计_李苦李的博客-程序员资料

《实验三-shell脚本程序设计》由会员分享,可在线阅读,更多相关《实验三-shell脚本程序设计(10页珍藏版)》请在人人文库网上搜索。1、实 验 报 告课程名称 Linux系统实践 实验项目 LINUX SHELL脚本程序设计 实验仪器 PC 系 别 计算机学院 专 业 网络工程 班级/学号 网1702/2017011463 学生姓名 孟启贤 实验日期 4.15 成 绩 指导教师 李艳平 实验...

随便推点

QT QML QtWebEngine 打开摄像头_ms_勇往直前的博客-程序员资料

qml 代码 index.qmlimport QtQuick 2.0import QtQuick 2.0import QtQuick.Window 2.0import QtWebEngine 1.7import QtQuick.Controls 2.4import QtQuick.Layouts 1.11ApplicationWindow { id: window ...

scikit-optimizer 源码分析_数学工具构造器的博客-程序员资料

文章目录训练前对样本空间进行TransformInteger, Real随机森林是怎样预测标准差的采集函数的计算方法EIPILCB训练前对样本空间进行Transformskopt.utils.cook_estimator 这个函数在构建代理函数skopt.optimizer.optimizer.Optimizer#_tell这里是在做代理模型训练Integer, Realself.XiOut[4]: [[1, 0.01032326035197658, 4, 11, 84]]self.space

图形加速卡技术_小鱼人会飞的博客-程序员资料

转自:http://www.opengpu.org/bbs/forum.php?mod=viewthread&tid=4197前言:眼泪的多年收藏啊,这是篇相当好的文章。首先本文非常专业地道,当然,新手朋友们肯定会晕的,我看着都头大…… 不过其讲解的知识非常系统详细。基本上,显卡的所有基础知识都涵盖了,有兴趣的朋友可以仔细看看、学习一下。眼泪我也同样再复习复习。另外,这篇虽

Linux下的网络协议分析工具-tcpdump_weixin_34185320的博客-程序员资料

对于linux下网络通信数据包的分析,常常由于不像windows那样可视化,所以通常需要我们使用tcpdump抓取数据,然后在windows下使用wireshark来打开具体分析。TCPDUMP简介在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使...

PostMessage()_丫丫afc的博客-程序员资料

PostMessage函数PostMessage是WindowsAPI(应用程序接口)中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。函数功能该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMess...

如何在Ubuntu中安装rpm包_This is bill的博客-程序员资料

原本是为了装flash player但是下载下来的是rpm的包, 所以有这个问题 解决方案Normally you install software or deb packages on Ubuntu/Mint linux via Synaptic, Ubuntu Software Center/ppa, or an apt-get command from the termina...

推荐文章

热门文章

相关标签