iOS 10:一、CAAnimationDelegate 的简单适配

来源:霖溦(@羽霖溦)
链接:http://www.jianshu.com/p/e9feb2c0c3f1

一、iOS10中CAAnimationDelegate的警告

原有的工程用xcode8打开编译后,莫名的增加了许多警告,其中关于动画的警告有这样一个,虽然运行后发现并没有什么影响,但还是要探究一下:

这里写图片描述

在这里的原因就很明了了,动画的代理没有遵循协议。

于是:
这里写图片描述

把这段代码再用xcode7编译一下试试。。。报错了。。。。。。为什么呢?

仔细想下,在iOS10之前写动画的协议方法,从来就没记得要去遵循系统的动画代理,iOS10偏偏又因为这里给了个警告,还是先仔细对比下API吧:

iOS9.2下的api:
这里写图片描述
iOS 10.2下的api:
这里写图片描述

iOS10之前,CAAnimationDelegate只是基类的分类方法,是扩展,至于为什么也要像协议方法那样指定代理对象,应该是和其内部实现有关(只是用该指针在内部调用对应类的方法),需要代理对象。但在iOS10以后,CAAnimationDelegate从分类蜕变为独立的协议方法了,所以不遵循协议,就给了警告。仔细观察一下CAAnimationDelegate的delegate对象,它一直是一个strong类型,一般代理变量不都是weak吗?关于这点,本人只是结合API的注释理解为:animation是跟随layer->view的生命周期的,需要特定的设置释放,所以循环引用的问题不作考虑。

二、iOS10中CAAnimationDelegate的适配

利用__IPHONE_OS_VERSION_MAX_ALLOWED系统宏进行条件编译,做法如下:
这里写图片描述
但是xcode7上编译还是报错,这是因为__IPHONE_10_0这个宏,这个宏代表了系统版本,每次系统跟新,宏也会对应增加新的,看下其定义:
这里写图片描述

这就是问题所在了,因为旧版本的API中,下面关于iOS10这句版本宏定义,根本不存在,也就是说,#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0这句在xcode8之前的版本上运行,是个恒成立的条件。。。条件编译的限制也就失去了本来的意义。。。

所以应该这么写就对了:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值