最近调查的一个bug和内存泄露都和CoreAnimation有关,因此谈一下使用CoreAnimation需要注意的几个问题

  1. CAAnimation的delegate属性是retain的,这个设计确实比较坑人,完全违背了“一致性”原则,产品里面的有个内存泄露就和这个有关。

  2. CALayer的addAnimation:forKey方法会对第一个参数,也即animation对象进行copy;这种设计的一个结果是,如果你同时添加了多个animation,在CAAnimation的delegate方法animationDidStop:finished里面无法通过比较引用来区分animation;要想达到区分的目的,只能通过[CAAnimation setValue:forKey]设定一个属性,比如ID,然后在delegate方法里面去比较这个属性值。

  3. 尽量不要将CAAnimation的removedOnCompletion设置为NO,否则的话,很容易发生内存泄露;参考第1点,常见的场景是有一个view,里面创建了一个CAAnimation添加给了自身,CAAnimation的delegate设成了view自身,至此一个循环引用形成

CAAnimation *animation = ...

animation.delegate = self;

animation.removeOnComplete=NO;

[self.layer addAnimation:animation];


4. 很多人之所以将removedOnCompletion设置成为YES,是为了在CAAnimation结束之后,CALayer不要回退到动画前的状态,这个正确的解决方案是这样的,在动画开始之前将layer的相关属性设置为目标值 ```
CABasicAnimation *animation = [CABasicAnimation animationWithProperty:@property];
animation.fromValue = @fValue;
animation.toValue = @tValue;
[layer addAnimation:animation forKey:@key];
layer.property = tValue //设置layout的属性值为目标值
  1. 要理解上面这个方案之所以是正确的,必须要稍微了解一下CALayer动画的原理,每个CALayer有一个对应的present layer用来做动画,此时自身可以叫做model layer,顾名思义,model layer是用来保存相对稳定的属性的,而present layer使用来临时渲染动画效果的。

    在动画运行的过程中,屏幕上显示的是present layer而不是model layer,animation对象对属性值进行插值处理的目标也是present layer,当动画结束后,model layer又显示出来了。

    理解了这一点,很多CAAnimation的现象就不难理解了,removedOnCompletion属性设置为YES,看起来确实可以使layer保持动画的结束状态,因为显示的一直就是present layer。而动画开始之前,将layer的属性设置为目标属性,也不会和动画相互产生作用,因为动画根本不会去修改layer的属性。

objc.io最近推出一个Animation主题,相当给力。

CoreAnimation注意事项的更多相关文章

  1. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  2. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

  3. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  4. app开发外包注意事项,2017最新资讯

    我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...

  5. favicon.ioc使用以及注意事项

    1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...

  6. ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. 【原】Masonry+UIScrollView的使用注意事项

    [原]Masonry+UIScrollView的使用注意事项 本文转载请注明出处 —— polobymulberry-博客园 1.问题描述 我想实现的使用在一个UIScrollView依次添加三个UI ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

随机推荐

  1. PC软件与PLC串口通信 奇偶检验问题

    PC软件与PLC进行串口通信 波特率:19200 校验位:偶检验 数据位:8 停止位:1   现象 一,PC软件向PLC可以发送1,2,4,5,7,8,但是3,6,9发送出去后,PLC无法收到 二,使 ...

  2. VS2010插件

    Highlight all occurrences of selected words

  3. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  4. NOIP2017+停课总结

    注意 此文章禁止一切含虚伪内容的评论,违者删除评论 其删除解释权归博主所有 Part1 论yyb NOIP 如何炸裂 前言 离NOIP已有三个星期,忘却的救主快要降临了吧,我正有写一篇总结的必要了.. ...

  5. [SCOI2007]蜥蜴

    网络流 一个点拆成两个,注意要把某一类边连反过来 这样才能保证有限制 # include <bits/stdc++.h> # define IL inline # define RG re ...

  6. telnet命令使用详解

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  7. UWP 使用UCT的Markdown控件

    之前在网上偶然碰到过 一个在线的Markdown Text编辑器 http://mahua.jser.me/,功能很齐全. 然后就突然有了一个大胆的想法 这个玩意要是在uwp中实现,用来做更新日志说明 ...

  8. java容器类2:Map及HashMap深入解读

    Java的编程过程中经常会和Map打交道,现在我们来一起了解一下Map的底层实现,其中的思想结构对我们平时接口设计和编程也有一定借鉴作用.(以下接口分析都是以jdk1.8源码为参考依据) 1. Map ...

  9. win8.1下无法运行vc++6.0的解决方法

    参考网址: http://wenku.baidu.com/link?url=A6mzeCDLNW1vCV7Vm5p83jqSzguiOFlH5FX-7kdN9NJXS_ORXYuaVDn1Prnz_F ...

  10. C语言--第0次作业

    1.你认为大学的学习生活.同学关系.师生应该是怎样?请一个个展开描写. 学习生活 大学是一个过渡时间,它不同于高中与社会.我希望自己可以养成自主学习的习惯,也希望能在大学学习中找到属于自己的节奏,不被 ...