技术标签: 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代替就解决了
翻译类字典辞典 英汉类字典辞典 金山词霸2006在线版 ——
方案通过webpack的postcss-loader+postcss-css-css-variable编译生成固定的代码例如::root { --white: #fff; --black: #000;}a { border: 1px solid var(--white);}span { color: var(--black);}通过webpack的pos...
sqlSession一共俩个实现类,我们这里分析默认的DefaultSqlSession类public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) { try { //ms对象代表我们的xml中的一条sql。例如:<select...
前言这些题目是网友去百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。欢迎一线公司员工以及网友提交面试题库,欢迎留言。网上的都是按照公司划分的,想找具体某一方面的知识点有点不好找,我这里就根据知识点分门别类的整理了一下,想看哪一块可以快速找到。阿里巴巴面试问题还记得一些,一部分已经忘记了,为了防止再忘记,所以写出来。1:你是如何理解Android操作系统的。2:是否熟悉framework层,如果熟
内容在编辑 BIM IFC 文件之前,了解 Revit 导出设置。用户建筑师、工程师、设计师、项目经理、BIM 经理。方法1. 定义要导出的图元在 Revit 项目中,定义专用于导出 IFC 文件的三维视图。在此视图中,您可以控制对编辑文件的团队成员可见的图元。请勿包含编辑软件不支持的类别,例如 HVAC 图元。最好在协调模型中共享这些类别。2. 检查 IFC 导出映射文件选择“文件”>“导...
《实验三-shell脚本程序设计》由会员分享,可在线阅读,更多相关《实验三-shell脚本程序设计(10页珍藏版)》请在人人文库网上搜索。1、实 验 报 告课程名称 Linux系统实践 实验项目 LINUX SHELL脚本程序设计 实验仪器 PC 系 别 计算机学院 专 业 网络工程 班级/学号 网1702/2017011463 学生姓名 孟启贤 实验日期 4.15 成 绩 指导教师 李艳平 实验...
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 ...
文章目录训练前对样本空间进行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下网络通信数据包的分析,常常由于不像windows那样可视化,所以通常需要我们使用tcpdump抓取数据,然后在windows下使用wireshark来打开具体分析。TCPDUMP简介在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使...
PostMessage函数PostMessage是WindowsAPI(应用程序接口)中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。函数功能该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMess...
原本是为了装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...