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 ...
随机推荐
- SpringBoot特性
一.SpringBoot解决的问题 1.使编码变得简单 2.使配置变得简单 3.使部署变得简单 4.使监控变得简单 二.springboot主要特性 1.遵循习惯优于配置的原则.使用springboo ...
- 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)
[BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...
- PHP之工厂方法模式(三)
定义 定义一个用于创建对象的接口(抽象工厂类),让子类决定实例化哪一个类,工厂方法使得一个类的实例化延迟到其子类(抽象工厂类的子类). 工厂方法模式是简单工厂模式的进一步抽象和推广.在简单工厂 ...
- java操作impala
public class App { static String JDBC_DRIVER = "com.cloudera.impala.jdbc4.Driver"; static ...
- angularjs promise详解
一.什么是Promise Promise是对象,代表了一个函数最终可能的返回值或抛出的异常,就是用来异步处理值的. Promise是一个构造函数,自己身上有all.reject.resolve这几个异 ...
- 34.Ajax
优先级 如果发送的是[普通数据] jQuery XMLHttpRequest iframe 如果发送的是[文件] iframe jQuery(FormData) XMLHttpRequest(Form ...
- Scala编程快速入门系列(二)
目 录 一.Scala概述 二.Scala数据类型 三.Scala函数 四.Scala集合 五.Scala伴生对象 六.Scala trait 七.Actor 八.隐式转换与隐式参数 九.Sca ...
- 大数据(3):基于sogou.500w.utf8数据Hbase和Spark实践
1. HBase安装部署操作 a) 解压HBase安装包tar –zxvf hbase-0.98.0-hadoop2-bin.tar.gzb) 修改环境变量 hbase-env.shexport JA ...
- 计算机基础-Day1
计算机基础-Day1 一.计算机基础 首先Python是一门编程语言 语言: 那什么是语言?语言就是一种事物与另一种事物沟通的介质. 所以说编程语言是程序员跟计算机沟通的介质,那么为什么要跟计算机沟通 ...
- spring boot rest例子
简介: 本文将帮助您使用 Spring Boot 创建简单的 REST 服务. 你将学习 什么是 REST 服务? 如何使用 Spring Initializr 引导创建 Rest 服务应用程序? 如 ...