“你解释清楚,我有CALayer,为什么需要UIView!”听到这样的问题,你是不是愣住了?卧槽!这些都是乱七八糟的问题。UIView继承自UIResponder,主要特点是可以响应触摸事件。而CALayer实际上管理的是图层内容。我们做的事情不一样,是两个东西,我们的存在互不影响,这是理所当然的事情。不过仔细想想,真的是五子棋看书机SoEasy吗?当你仔细揣摩其背后的用意时,你会发现OMG!!!UILayer如果UIKit不是苹果的,而是我们的,会发生什么?是的,也许UIView和CALayer组合成一个叫做“UILayer”的东西。这个UILayer是一个全能的Layer,可以负责管理显示内容,也可以处理触摸事件,挂吧!好的!假设UILayer已经这么累很久了,它存在于iOS2。它太聪明了,它从一开始就设计得如此糟糕。现在,您的产品经理微笑着走过来。在iOS3.2版本中,应该增加了手势识别。这个好办,改一下UILayer的价格,加个手势识别就可以了。你的产品经理又过来拍了拍你的肩膀,你很信任吧?现在iOS4引入了Block语法,在之前的动画基础上加一个Block版本。你想想,很简单,改个UILayer的源码就行了。你的产品经理又过来了,哎,还带了两个产品小姐姐过来围着你。他们都是公司名人。他们受到所有人的信任,他们有点害羞。这次我要求你为iOS6添加一个名为AutoLayout的大功能。这真是一个很大的功能。需要改动的地方很多,也给测试带来了很多困难。现在UILayer类越来越大,功能强大到杀了你3000,发布不能推迟。这么重要的一门课,你得小心翼翼的改,才对得起那个女孩子对你的深情期盼。最后你搞定了,哈哈,你是年终优秀员工。你的产品经理又来了,哟,拍拍你的脖子,给你讲笑话,还请你吃饭,哎呀,产品妹子还在一直夸你呢。是的,又一次来到了历史性的时刻,iOS迎来了第七个大版本的改版。iOS7变得更小更清新,并且加入了物理效果,甚至是视差。产品经理要颠覆产品的设计理念,试图再次改变世界,真是了不起。然后,您单击巨大的UILayer类。好像要从上到下改,但是要改的东西那么多,而且时间有限。看来完成测试的时间还不够。我应该怎么办?不可能,一年一度的发布会不能延期,不然怎么在全世界面前有面子。但是时间不等人,就算程序员每天鼓励老师鼓励你,也救不了你。你无法控制的代码,在iOS7的历史关头,你的神话陨落了。分析所以,在这个天然的SDK背后,蕴藏着丹牛门几十年的设计智慧。你应该能在里面看到很多门道。这次通过分析UIView和CALayer,我们可以得到一些东西。机制与策略分离,更不可变,各司其职,泄漏更少,机制与策略分离Unix内核设计的主要思想之一是提供机制(Mechanism)而不是策略(Policy)。编程问题可以从机制和策略部分中抽象出来。一旦机制实施,它们就很少改变,但策略通常会得到优化。例如,原子可以看作是机制,各种原子的组合就是一种策略。CALayer也可以看作是一种提供图层绘制的机制。大家可以打开CALayer的头文件看,基本上没有太大的变化,而UIView可以算是一个策略,变化比较多。级别越低,机制越多,机制越稳定。机制和策略的分离可以减少需要修改的代码,尤其是底层代码,可以提高系统的稳定性。更加不变的稳定性对您有何感觉?坚硬的?不可变形?稳定性实际上是不可改变的。一个系统拥有的不可变的东西越多,它就越稳定。所以该机制恰好满足了这个不可变因素。构建系统的一个指导思想是尽可能从可变事物中提取不可变事物。水成不了高楼,但坚固的混凝土可以。更少的修改意味着更少的错误机会。无论他们多么强大,他们都不能做到他们所说的一切。万一有一天他们失败了,他们会突然之间什么都做不了。因此,不应该仅仅基于分散风险的原则而存在全能类。各司其职,相互配合,将可控粒度降到最低,这样也可以让系统更稳定,更容易修改。泄漏较少的接口应该向公众开放。根据82原则,其实20%的接口可以满足80%的需求,剩下的80%应该隐藏在后面。因为少泄漏总是安全的,不是吗?其余80%的专家界面可以进行深层隐藏。比如UIView覆盖了CALayer的大部分接口,提取构建了更易用的框架和动画实现,更容易上手。结尾
