11) 考虑绘制

  考虑绘制

  在iOS中制作漂亮的按钮有多种方法。可以使用全尺寸图片,可缩放图片,或者使用CALayer, CoreGraphics, 甚至是OpenGL来手动测量和绘制按钮。

  当然,这些方法的复杂程度也不同,并且性能也有所区别。这里有一篇相关文章值得阅读一下:关于iOS中图形的性能。其中Andy Matuschak(曾经是苹果的UIKit小组的组员)对这篇文章的评论中,对于不同的方法及其性能权衡有非常好的一个见解。

  简单来说,使用预渲染图片技术是快的,因为iOS中不用等到在屏幕上显示的时候才创建图形和对形状进行绘制(图片已经创建好了!)。这样带来的问题是需要把所有的图片都放到程序bundle中,从而增加了程序的大小。因此使用可伸缩图片在这里将排上用场了:可以移除“浪费”空间的图片——iOS可以重复利用。并且针对不同的元素(例如按钮)不需要创建不同的图片。

  不过,使用图片的话会失去代码对图片的控制能力,进而针对不同的程序,需要重复的生成每一个需要的图片,并反复的放到每个程序中。这个处理过程一般会比较慢。另外一点是如果你需要一个动画,或者许多图片都要进行轻微的调整(比如多个颜色的覆盖),那么需要在程序中加入许多图片,进而增加了程序bundle的大小。

  总的来说,你需要考虑一下什么才是重要的:绘制性能还是程序大小。一般来说都重要,所以在同一个工程中,应该两种都应考虑。

  12) 处理内存警告

  当系统内存偏低时,iOS会通知所有在运行的程序。苹果的官方文档中介绍了如何处理低内存警告:

  If your app receives this warning, it must free up as much memory as possible. The best way to do this is to remove strong references to caches, image objects, and other data objects that can be recreated later.

  如果程序收到了低内存警告,在程序中必须尽量释放内存。佳方法是移除强引用的涉及到的缓存,图片对象,以及其它可以在之后使用时还可以重新创建的数据对象。

  UIKit中提供了如下几种方法来接收低内存(low-memory)警告:

  实现app delegate中的applicationDidReceiveMemoryWarning: 方法。

  在UIViewController子类中重写(Override)didReceiveMemoryWarning方法。

  在通知中心里面注册UIApplicationDidReceiveMemoryWarningNotificatio通知。

  在收到以上任意的警告时,需要立即释放任何不需要的内存。

  例如,UIViewController的默认情况是清除掉当前不可见的view;在UIViewController的子类中,可以清除一些额外的数据。程序中不没有显示在当前屏幕中的图片也可以release掉。

  当收到低内存警告时,尽量释放内存是非常重要的。否则,运行中的程序有可能会被系统杀掉。

  不过,在清除内存时要注意一下:确保被清除的对象之后还可以被创建出来。另外,在开发程序的时候,请使用iOS模拟器中的模拟内存警告功能对程序进行测试!

13) 重用花销很大的对象

  有些对象的初始化非常慢——比如NSDateFormatter和NSCalendar。不过有时候可以避免使用这些对象,例如在解析JSON/XML中的日期时。

  当使用这些对象时,为了避免性能上的瓶颈,可以尝试尽量重用这些对象——在类中添加一个属性或者创建一个静态变量。

  注意,如果使用静态变量的话,对象会在程序运行的时候一直存在,像单例一样。

  下面的代码演示创建一个延迟加载的日期格式属性。第一次调用属性的时候,会创建一个新的日期格式。之后再调用的话,会返回已经创建好的实例对象:

  // in your .h or inside a class extension@property (nonatomic, strong) NSDateFormatter *formatter; // inside the implementation (.m)// When you need, just use self.formatter- (NSDateFormatter *)formatter { if (! _formatter) { _formatter = [[NSDateFormatter alloc] init]; _formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy"; // twitter date format } return _formatter;}

  另外,还需要记住的是在设置NSDateFormatter的日期格式时,同样跟创建新的一个NSDateFormatter实例对象时一样慢!因此,在程序中如果需要频繁的处理日期格式,那么对NSDateFormatter进行重用是非常好的。