1.iOS10中CAAnimationDelegate的警告

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

关于警告的原因可以参考:

IOS Assigning to 'id<Delegate>' from incompatible type...解决办法

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

警告消除,万事大吉~
等下,真的就这么万事大吉了?把这段代码再用xcode7编译一下试试。。。报错了。。。。。。为什么呢?
仔细想下,在iOS10之前写动画的协议方法,从来就没记得要去遵循系统的动画代理,iOS10偏偏又因为这里给了个警告,还是先仔细对比下API吧:

iOS9以前的CAAnimationDelegate

iOS10以后的CAAnimationDelegate

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

2.iOS10中CAAnimationDelegate的适配

利用__IPHONE_OS_VERSION_MAX_ALLOWED系统宏进行条件编译,做法如下:

这样,在不同版本的环境下运行就做了区分,再等等……xcode7上编译还是报错,这段代码有什么问题吗?

 #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
@interface ViewController () <CAAnimationDelegate>
#else
@interface ViewController ()
#endif

有!问题在于__IPHONE_10_0这个宏,这个宏代表了系统版本,每次系统跟新,宏也会对应增加新的,看下其定义:

 #define __IPHONE_9_3      90300
#define __IPHONE_10_0 100000

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

  #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000
@interface ViewController () <CAAnimationDelegate>
#else
@interface ViewController ()
#endif

这样做,就不会有问题了,将对应的版本号宏直接写成对应的数,但是这也存在一定的风险:就是__IPHONE_10_0这个宏的具体对应值是否会因为api的又一次升级而改变,这个很难说,至少之前都是比较稳定的,只是对应增加,而没有变化,但这毕竟是人家在维护的东西,如果直接用对应的值,在每次系统升级时,做一下检查是十分有必要的!

所以前面提到,这样做适配,可能并不是一个好的办法,当然如果不嫌麻烦,反着来,多写几句条件编译的逻辑,就可以避免直接用上面的宏所对应的值,但是这意味着要考虑自己的工程兼容到的最低的系统版本了,写起来应该会很。。。

下面是与本文相关的一个简单的Demo,有兴趣的可以参考下:

iOS10 CAAnimationDelegate 的简单适配的更多相关文章

  1. AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

    AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...

  2. iOS10 CAAnimationDelegate的适配

    最近在xcode8打开之前的动画代码,看到如下警告

  3. iOS12、iOS11、iOS10、iOS9常见适配

    作者:花丶满楼 链接:https://juejin.im/post/5c49a7d0518825254e4d46fc 一.iOS12(Xcode10) 1.1.升级Xcode10后项目报错 不允许多个 ...

  4. iOS10推送通知适配

    iOS10推送新增了UserNotifications Framework,使用起来其实很简单. 只是在iOS10以上系统上点击通知栏,回调方法不再走原来的这两个方法 - (void)applicat ...

  5. 前端pc版的简单适配

    我们都知道对于前端pc版本的适配是一个难题,大部分都是做的媒体查询.但是有时间公司不要媒体查询 就是需要不管多大的屏幕都是满屏显示.我就在考虑为啥不用rem给pc端做个适配. 我是基于设计图是1920 ...

  6. 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)

    推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...

  7. iOS - 总结适配IOS10需要注意的问题

    1.自动管理证书 首先要说的就是Xcode8.打开Xcode8最明显的就是Targets-->General下的自动管理证书模块.以前对于新手来说无论是开发还是打包都必须要被苹果的开发签名系统虐 ...

  8. iOS开发 iOS10推送必看(基础篇)

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助.   原文链接   一.简单入门篇---看完就可以简单适配完了相对简单的推送证书以及环境的 ...

  9. iOS开发 iOS10推送必看

    iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...

随机推荐

  1. jQuery实现锚点跳转(就一行代码)

    /* 锚点跳转 */ function anchor(p,fn) { $("html,body").animate({ scrollTop: $("#" + p ...

  2. Annotation Type EnableTransactionManagement

    http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Ena ...

  3. Spark的动态资源分配

    跑spark程序的时候,公司服务器需要排队等资源,参考一些设置,之前不知道,跑的很慢,懂得设置之后简直直接起飞. 简单粗暴上设置代码: def conf(self): conf = super(Tbt ...

  4. 网站运维之JAVA-SSH框架数据同步问题

    一.环境 SSH环境,查询用的是基于Hibernate的配置文件构建了一个SessionFactory,主要代码如下 public class HibernateUtil { private stat ...

  5. Android面试题收集

    Android是一种基于Linux的自由及开放源码的操作系统,主要使用于移动设备.如智能手机和平板电脑.由Google公司和开放手机联盟领导及开发.这里会不断收集和更新Android基础相关的面试题, ...

  6. Sql Server重复数据删除

    --在sql2005下可以 ,sql2000不可以 create  table tb(id int,name varchar(4))insert tb select 1,'aa'union all s ...

  7. ORA-16038: log 3 sequence# 103 cannot be archived

    [size=large]今天在自己机器做了个实验,插入10万条,由于空间少,重启数据库时出现: [size=x-large]SQL> startup ORACLE instance starte ...

  8. RocketMQ【未完成】

    RocketMQ 是一款快速地.可靠地.分布式.容易使用的消息中间件,由 alibaba 开发,其前身是 metaq,metaq 的第一个版本是可以看成是linkedin的kafka(scala)的j ...

  9. mybatis学习资源

    官网:http://mybatis.org/index.html 代码:https://code.google.com/p/mybatisnet/ wiki:http://zh.wikipedia.o ...

  10. javascript的冒泡排序, 快速排序, 选择排序, 插入排序

    冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...