最近调查的一个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. js运算符单竖杠“|”的用法和作用及js数据处理

    js运算符单竖杠“|”的作用 很多朋友都对双竖杠“||”,了如指掌,因为这个经常用到.但是大家知道单竖杠吗?今天有个网友QQ问我,我的 javascript实用技巧,js小知识 , 这篇文章里面,js ...

  2. 20165304《JAVA程序设计》第二周学习总结

    课本内容总结 第一章 1.标识符与关键字 (1) 标识符由字母.数字.下划线"_".美元符号"$"组成,第一个字符不能是数字. 不能把java关键字和保留字作为 ...

  3. AndroidStudio 集成litepal 报错

    E/AndroidRuntime(24972): org.litepal.c.b: can not find a class named org.litepal.model.Table_Schema ...

  4. hihocoder #1456 : Rikka with Lattice(杜教筛)

    hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...

  5. 【BZOJ1500】【NOI2005】维修数列(Splay)

    [BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...

  6. POJ 2195 Going Home (费用流)

    题面 On a grid map there are n little men and n houses. In each unit time, every little man can move o ...

  7. Luogu1121:环状最大两段子段和

    题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...

  8. 如何通过Spring Boot配置动态数据源访问多个数据库

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  9. checkBox半选中状态

    checkbox 可以半选中,这个特性,很多浏览器都支持 // 用 input.indeterminate 这个属性来获取或者设置半选中状态,必须要用 js 添加属性,才有效果. input.inde ...

  10. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...