CoreAnimation注意事项
最近调查的一个bug和内存泄露都和CoreAnimation有关,因此谈一下使用CoreAnimation需要注意的几个问题
CAAnimation的delegate属性是retain的,这个设计确实比较坑人,完全违背了“一致性”原则,产品里面的有个内存泄露就和这个有关。
CALayer的
addAnimation:forKey方法会对第一个参数,也即animation对象进行copy;这种设计的一个结果是,如果你同时添加了多个animation,在CAAnimation的delegate方法animationDidStop:finished里面无法通过比较引用来区分animation;要想达到区分的目的,只能通过[CAAnimation setValue:forKey]设定一个属性,比如ID,然后在delegate方法里面去比较这个属性值。尽量不要将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的属性值为目标值
要理解上面这个方案之所以是正确的,必须要稍微了解一下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注意事项的更多相关文章
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
- TODO:Golang指针使用注意事项
TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...
- app开发外包注意事项,2017最新资讯
我们见过很多创业者,栽在这app外包上.很多创业者对于app外包这件事情不是特别重视,以为将事情交给app外包公司就完事了,实际上不是的.无论是从选择app外包公司还是签订合同.售后维护等各方面都有许 ...
- favicon.ioc使用以及注意事项
1.效果 2.使用引入方法 2.1 注意事项:(把图标命名为favicon.ico,并且放在根目录下,同时使用Link标签,多重保险) 浏览器默认使用根目录下的favicon.ico 图标(如果你并没 ...
- ORACLE分区表梳理系列(二)- 分区表日常维护及注意事项(红字需要留意)
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- 【原】Masonry+UIScrollView的使用注意事项
[原]Masonry+UIScrollView的使用注意事项 本文转载请注明出处 —— polobymulberry-博客园 1.问题描述 我想实现的使用在一个UIScrollView依次添加三个UI ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- 《连载 | 物联网框架ServerSuperIO教程》- 6.并发通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- js运算符单竖杠“|”的用法和作用及js数据处理
js运算符单竖杠“|”的作用 很多朋友都对双竖杠“||”,了如指掌,因为这个经常用到.但是大家知道单竖杠吗?今天有个网友QQ问我,我的 javascript实用技巧,js小知识 , 这篇文章里面,js ...
- 20165304《JAVA程序设计》第二周学习总结
课本内容总结 第一章 1.标识符与关键字 (1) 标识符由字母.数字.下划线"_".美元符号"$"组成,第一个字符不能是数字. 不能把java关键字和保留字作为 ...
- AndroidStudio 集成litepal 报错
E/AndroidRuntime(24972): org.litepal.c.b: can not find a class named org.litepal.model.Table_Schema ...
- hihocoder #1456 : Rikka with Lattice(杜教筛)
hihocoder #1456 : Rikka with Lattice(杜教筛) 题意 : 给你一个\(n*m\)方格图,统计上面有多少个格点三角形,除了三个顶点,不覆盖其他的格点(包括边和内部). ...
- 【BZOJ1500】【NOI2005】维修数列(Splay)
[BZOJ1500][NOI2005]维修数列(Splay) 题面 不想再看见这种毒瘤题,自己去BZOJ看 题解 Splay良心模板题 真的很简单 我一言不发 #include<iostream ...
- 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 ...
- Luogu1121:环状最大两段子段和
题面 传送门 Sol 两种情况 第一种就是类似\(***000***000***(0表示选)\),这个可以DP 设\(h[0/1/2/3][i]\)表示到第\(i\)位的状态: \(0\):表示还没选 ...
- 如何通过Spring Boot配置动态数据源访问多个数据库
之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...
- checkBox半选中状态
checkbox 可以半选中,这个特性,很多浏览器都支持 // 用 input.indeterminate 这个属性来获取或者设置半选中状态,必须要用 js 添加属性,才有效果. input.inde ...
- Android开发——设置界面的创建
前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...