0%

Core Animation用于为视图或其他可视化元素添加动画. Core Animation会将视图内容缓存到一个能直接被图形硬件使用的位图中. 在某些特定场景下, 这种缓存行为可能会影响应用内容的呈现形式和组织方式. 但在大部分情况下, 开发者都是在无感知的使用Core Animation. 除了缓存视图内容之外, Core Animation还可以将任意可视化内容与视图内容结合在一起进行动画.

大部分动画都与可视化对象的属性值改变有关, 例如视图的位置,大小或透明度变化. 当这些属性值变化时, Core Animation会根据属性的类型以及旧值和新值自动执行动画.

阅读全文 »

Core Animation是一个用于图像绘制和动画渲染的基础框架, 同时兼容iOS和OS X平台. 使用Core Animation可以很便捷的为应用程序的视图或其他可视化元素添加动画. 因为绘制动画的大部分工作都由Core Animation完成, 开发者只需要配置一些动画参数(比如动画的起始点和结束点), 然后告诉Core Animation开始执行动画即可. 接下来, Core Animation会把大部分的实际绘制工作交给专门的图形硬件. 这就保证了动画的高帧率和流畅性, 而且不会对CPU造成额外的负担.

阅读全文 »

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

1
2
3
4
5
给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解法(C语言):

阅读全文 »

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

1
2
3
4
5
6
给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

阅读全文 »

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

1
2
3
4
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解法(C语言):

阅读全文 »

代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。

代理有多种类型:

  • 远程代理:为位于不同地址空间或网络上的对象提供本地代表
  • 虚拟代理:根据需要创建开销大的对象
  • 保护代理:根据各种访问权限控制对原对象的访问
  • 智能引用代理:通过对真正对象的引用进行计数来管理内存。也用于锁定真正对象,让其他对象不能对其进行修改
阅读全文 »

状态模式将状态封装成为独立的类, 并将动作传递给当前的状态对象. 通过这种方式允许对象在内部状态改变时同时改变其行为, 即调用相同的对象方法, 但是对象会根据内部状态不同执行不同的行为.

状态模式的优点:

  • 结构清晰, 避免了过多的if或switch判断语句, 降低了代码复杂度, 提高了系统可维护性
  • 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数
  • 封装了状态转换规则

状态模式的缺点:

  • 状态模式的使用必然会增加系统类和对象的个数
  • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
阅读全文 »

组合模式允许将对象组合成树形结构来表现”整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

组合模式牺牲单一责任设计原则换取透明性(transparency), 让组件的接口同时包含一些管理子节点和叶子节点的操作,使用者就可以将组合和叶子结点一视同仁, 也就是说, 一个元素究竟是组合还是叶子节点,对使用者是透明的.

组合模式中涉及到的角色:

  • Component: 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为
  • Leaf: 叶子结点对象,没有子结点
  • Composite: 存储Composite和Leaf两种类型的子部件,实现与子部件有关操作,如增加(add)和删除(remove)等

在以下情形时,考虑使用组合模式:

  • 想获取对象抽象的树形表示
  • 想让客户端同意处理组合结构中的所有对象
阅读全文 »

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露结构的底层表示和细节。

在以下情形,考虑使用迭代器模式:

  • 需要访问组合对象的内容,而又不暴露其内部表示
  • 需要通过多种方式遍历组合对象
  • 需要提供一个统一的接口,用来遍历各种类型的组合对象

迭代器模式涉及到以下几个角色:

  • 抽象迭代器(Iterator)角色:此抽象角色定义出遍历元素所需的接口。
  • 具体迭代器(ConcreteIterator)角色:此角色实现了Iterator接口,并保持迭代过程中的游标位置。
  • 聚集(Aggregate)角色:此抽象角色给出创建迭代器(Iterator)对象的接口。
  • 具体聚集(ConcreteAggregate)角色:实现了创建迭代器(Iterator)对象的接口,返回一个合适的具体迭代器实例。
  • 客户端(Client)角色:持有对聚集及其迭代器对象的引用,调用迭代子对象的迭代接口,也有可能通过迭代子操作聚集元素的增加和删除。
阅读全文 »

模版方法模式在一个方法中定义一个算法的骨架,而将一些具体步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

在以下情形下,应该考虑使用模板方法:

  • 需要一次性实现算法的不变部分,并将可变的行为留给子类来实现
  • 子类的共同行为应该被提取出来放到公共类中,避免代码重复。现有代码的差别应该被分离为新的操作。然后用一个调用这些新操作的模板方法来替换这些不同的代码
  • 需要控制子类的扩展。可以定义一个在特定点调用”钩子(hook)”操作的模板方法。子类可以通过对hook操作的实现在这些点扩展功能
阅读全文 »