即使你对自己的技术功底有再多的自信,都请养成使用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?相关推荐

  1. 修复miniblink一处内存泄漏的bug

    最后的结论很简单,是我绑定v8 function的时候没释放.但查找问题的过程比较艰难,因为 v8的代码实在太难读了. 下面先大概了解下v8的垃圾回收机制. v8\src\global-handles ...

  2. “因为内存泄漏,我的 M1 MacBook Pro 瘫痪了”

    上个月,苹果在宣布"王炸候场中"后,19 号发布了 AirPods 3.HomePod mini 等新品,而这场发布会真正的主角当属新款 MacBook Pro:强悍的 M1 Pr ...

  3. Android内存泄漏leakcanary2.7

    一.内存泄漏 1.1 内存泄漏简介   内存泄漏,是指一些对象已经不再需要,但是无法成功被gc回收,导致这部分内存无法释放,造成资源的浪费.当大量的内存泄漏堆积时,严重时还容易间接引发OOM.   例 ...

  4. 我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏

    来源 | why技术 荒腔走板 大家好,我是 why,老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面图片中这个正在奔跑的少年,是正在参加校运会的我,那一年我 18 岁,高三. 参加 ...

  5. WPF框架的内存泄漏BUG

    用户在使用GIX4某模块的过程中,内存只见加不见减.我们怀疑出现了内存泄漏,所以我花了相当一段时间来进行此问题的排查. 我使用Red Gate公司的产品ANTS Memory Profiler 5进行 ...

  6. 我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。

    从一个BUG说起 前段时间翻到了一个 JDK 有点意思的 BUG,带大家一起瞅瞅. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=81371 ...

  7. log4j2:占位符引起的内存泄漏bug

    log4j2:占位符引起的内存泄漏bug log4j2使用 调用现象 排查手段 耗时原因 问题回顾 log4j2使用 之前用的logback,然后(抽了)换成log4j2,主要log4j2支持异步日志 ...

  8. 一次解决Linux内核内存泄漏实战全过程

    责编 | 张红月 来源 | Linux阅码场 2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题. ...

  9. iOS 对付内存泄漏,来说说我的调试方法

    2019独角兽企业重金招聘Python工程师标准>>> 苹果在iOS5推出了ARC(自动引用计数)技术,此模式下编译器会自动在合适的地方插入retain.release.autore ...

最新文章

  1. XFCE字体发虚的解决方法
  2. 几u产品结构计算机什么意思,计算机u系统组成.ppt
  3. python什么时候诞生的_关于RFC 3339日期时间:在Python中产生timestamp
  4. Eclipse安装Database Development插件。
  5. linux 块设备驱动 (三)块设备驱动开发
  6. 关于Ubuntu 使用PPPoe拨号上网,导致wifi没有错误。
  7. C语言在二叉搜索树找到第k个最小元素(附完整源码)
  8. readdir函数_PHP readdir()函数与示例
  9. delphi 复制文件 强制覆盖_网传美国选这三家中国橱柜企业为反倾销强制应诉人...
  10. python pyhook_pyhook的简单使用
  11. 二台计算机 共享,两台电脑如何共享
  12. Ubuntu Julia环境安装教程
  13. python制作GIF图
  14. Anmle,Factors,andMultiFactorModels
  15. 谈微软 KMS 激活
  16. C++秋招春招面试总结
  17. 如何在ubuntu 2210中安装NVIDIA 515显卡驱动、CUDA 11.7和cuDNN 8.4
  18. Noise2Noise:Learning Image Restoration without Clean Data读书笔记
  19. 金蝶、用友,舞剑SaaS
  20. SCCB(I2C)时序

热门文章

  1. java中几种常用的对象类型(po,vo,bo,dto)
  2. C/C++中的pi(pai)怎么打 【c语言】
  3. sap 双ALV联动显示示例(备份)
  4. 字符串转换,大写变小写,小写变大写
  5. 获取复选框的状态判断复选框是否选中状态
  6. 好玩的表情包机器人微信小程序源码下载支持直接搜索仿聊天界面
  7. 便宜好用积分兑换商城系统必须具备这些功能
  8. 达科为在创业板递交注册申请:拟募资8亿元,吴庆军父女为实控人
  9. phpspreadsheet 中文文档(七)技巧和诀窍
  10. Brytenwalda