Leak 内存泄漏检测

第一次使用Leak对项目进行内存泄漏的检测,也是查阅了许多资料,算是可以做到发现问题并解决问题。

我的项目泄漏情况是这样的:


图1

满屏的红叉让人心慌,那么如何找到泄露的位置呢?

首先要选中满是红叉的那一行,然后在这里


图2

选中Call Tree,

在右边

图3

选中Invert Call Tree 和 Hide System Libraries 两项,Invert Call Tree 的意思是翻转调用树,意思就是我们在调用函数时,是一层一层的,调用外层函数会一直进入内层,直到最后一层,有点递归的意思,当选中 Invert Call Tree 选项时,会直接显示内层函数,方便我们去寻找,否则会直接显示最外层的函数,我们需要将其一层一层展开,比较费劲,不直观。

而Hide System Libraries 的意思很明显了。就是隐藏系统类库,避免一些莫名其妙的,我们无法改动的信息迷惑我们。

那么接下来我们将看到泄漏列表:


图4

看到这里我震惊了,强大的AFNetworking也会存在泄露?

让我们再看看具体是哪里除了问题,双击那一行我们就可以进入到具体泄漏的那个函数


图5

可以看到每一行泄漏的byte大小都标了出来,其中蓝色的为最大。

这里就要思考一个问题了,AFNetworking内部的这些代码我们怎么改呢?

不必担心,我们发现问题出在这个方法

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

一直以来,我都以为这是一个manager是单例,带你进去一看其实不然,



图6

每次调用时都会创建一个新的对象,那么问题又来了,创建就创建呗,难道执行之后,还会不释放?

查阅资料后果真如此,我们使用的 AFHTTPSessionManager 继承自 AFURLSessionManager ,

创建对象时会调用傅父类的方法。


图7

点进去看,发现其强引用一个NSURLSession对象


图8

并且将自己设置为了NSURLSession对象的代理


图9

NSURLSession又是强引用代理


图10

这样便造成了循环引用,彼此谁也释放不了。

那么如何解决呢?

这里提供两种策略

(一)NSURLSession提供两个方法:


图11

这个方法会立刻取消当前任务,session对象被释放。那么循环引用不复存在。


图12

而finishTasksAndInvalidate方法,则会等待任务完成时将session释放,消除了循环引用。

我们可以在success 和 failure block中调用这两个方法,个人推荐使用finishTasksAndInvalidate。

(二)像AFNetworking 3.0 提供的DEMO中,是这么用的:

创建一个继承自NSHTTPSessionManager的类,实现单例方法。


图13

然后在自己封装的网络层中修改。

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值