无处不在的内存泄漏-苹果BUG?
即使你对自己的技术功底有再多的自信,都请养成使用Instruments工具排查内存泄漏的良好习惯,
即使Instruments再牛逼,你也还要养成看接口文档的良好习惯,因为你防谁也防不了苹果。。。
下面就是使用Instruments排查不出来的内存泄漏
直接上代码
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"colors"];
[animation setToValue:@[(__bridge id)DX_RGB(170, 127, 245).CGColor, (__bridge id)DX_RGB(137, 215, 244).CGColor,(__bridge id)DX_RGB(245, 214, 234).CGColor]];
[animation setDuration:3.0];
[animation setRemovedOnCompletion:NO];
[animation setFillMode:kCAFillModeForwards];
[animation setDelegate:self];
[gradientLayer addAnimation:animation forKey:@"animateGradient"];
gradientLayer是当前控制器的一个实例变量,最后退出当前视图控制器后,它没有调用dealloc,发生了内存泄漏,因为当前视图控制器和animation构成了强引用环。
将setRemovedOnCompletion改为YES或者屏蔽setDelegate方法不会造成内存泄漏,下面我会给出良好的解决方法;
再看看接口
/* The delegate of the animation. This object is retained for the
* lifetime of the animation object. Defaults to nil. See below for the
* supported delegate methods. */
@property(nullable, strong) id <CAAnimationDelegate> delegate;
原来delegate是strong的,苹果你咋不按套路出牌,苹果为什么要这样设计呢?不管出于什么原因,我们都要修复它
/* Called when the animation either completes its active duration or
* is removed from the object it is attached to (i.e. the layer). 'flag'
* is true if the animation reached the end of its active duration
* without being removed. */
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
尝试在这个回调方法中调用
[animation setDelegate:nil];
引发崩溃,信息如下:
*** Terminating app due to uncaught exception 'CAAnimationImmutable', reason: 'attempting to modify read-only animation <CABasicAnimation: 0x1740315c0>'
完美解决方法:
实现分类:
#import <objc/runtime.h>
static void* MyBasicAnimationKey = "MyBasicAnimationKey";@interface CABasicAnimation(BUG)<CAAnimationDelegate>- (void)setDebugDelegate:(id)delegate;@end@implementation CABasicAnimation(BUG)- (void)setDebugDelegate:(id)delegate
{self.delegate = self;//将委托指向自己,并实现委托方法objc_setAssociatedObject(self, MyBasicAnimationKey, delegate, OBJC_ASSOCIATION_ASSIGN);//这里通过对象关联来实现,注意这里必须是OBJC_ASSOCIATION_ASSIGN,而不能用OBJC_ASSOCIATION_RETAIN,否则仍然是强引用环。
}#pragma mark - CAAnimationDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{id obj = objc_getAssociatedObject ( self, MyBasicAnimationKey );[obj animationDidStop:anim finished:flag];//这里将实现转给关联对象
}@end
然后在DebugDelegate中实现- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag委托方法即可。
无处不在的内存泄漏-苹果BUG?相关推荐
- 修复miniblink一处内存泄漏的bug
最后的结论很简单,是我绑定v8 function的时候没释放.但查找问题的过程比较艰难,因为 v8的代码实在太难读了. 下面先大概了解下v8的垃圾回收机制. v8\src\global-handles ...
- “因为内存泄漏,我的 M1 MacBook Pro 瘫痪了”
上个月,苹果在宣布"王炸候场中"后,19 号发布了 AirPods 3.HomePod mini 等新品,而这场发布会真正的主角当属新款 MacBook Pro:强悍的 M1 Pr ...
- Android内存泄漏leakcanary2.7
一.内存泄漏 1.1 内存泄漏简介 内存泄漏,是指一些对象已经不再需要,但是无法成功被gc回收,导致这部分内存无法释放,造成资源的浪费.当大量的内存泄漏堆积时,严重时还容易间接引发OOM. 例 ...
- 我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏
来源 | why技术 荒腔走板 大家好,我是 why,老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面图片中这个正在奔跑的少年,是正在参加校运会的我,那一年我 18 岁,高三. 参加 ...
- WPF框架的内存泄漏BUG
用户在使用GIX4某模块的过程中,内存只见加不见减.我们怀疑出现了内存泄漏,所以我花了相当一段时间来进行此问题的排查. 我使用Red Gate公司的产品ANTS Memory Profiler 5进行 ...
- 我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。
从一个BUG说起 前段时间翻到了一个 JDK 有点意思的 BUG,带大家一起瞅瞅. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=81371 ...
- log4j2:占位符引起的内存泄漏bug
log4j2:占位符引起的内存泄漏bug log4j2使用 调用现象 排查手段 耗时原因 问题回顾 log4j2使用 之前用的logback,然后(抽了)换成log4j2,主要log4j2支持异步日志 ...
- 一次解决Linux内核内存泄漏实战全过程
责编 | 张红月 来源 | Linux阅码场 2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题. ...
- iOS 对付内存泄漏,来说说我的调试方法
2019独角兽企业重金招聘Python工程师标准>>> 苹果在iOS5推出了ARC(自动引用计数)技术,此模式下编译器会自动在合适的地方插入retain.release.autore ...
最新文章
- XFCE字体发虚的解决方法
- 几u产品结构计算机什么意思,计算机u系统组成.ppt
- python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
- Eclipse安装Database Development插件。
- linux 块设备驱动 (三)块设备驱动开发
- 关于Ubuntu 使用PPPoe拨号上网,导致wifi没有错误。
- C语言在二叉搜索树找到第k个最小元素(附完整源码)
- readdir函数_PHP readdir()函数与示例
- delphi 复制文件 强制覆盖_网传美国选这三家中国橱柜企业为反倾销强制应诉人...
- python pyhook_pyhook的简单使用
- 二台计算机 共享,两台电脑如何共享
- Ubuntu Julia环境安装教程
- python制作GIF图
- Anmle,Factors,andMultiFactorModels
- 谈微软 KMS 激活
- C++秋招春招面试总结
- 如何在ubuntu 2210中安装NVIDIA 515显卡驱动、CUDA 11.7和cuDNN 8.4
- Noise2Noise:Learning Image Restoration without Clean Data读书笔记
- 金蝶、用友,舞剑SaaS
- SCCB(I2C)时序