注意你可以通过 NSURLConnection 获取一个URL request, AFNetworking也一样的。这样你不必为采用这条tip而改变所有的networking代码了。

  如果想了解更多关于HTTP caching, NSURLCache, NSURLConnection的相关知识,可以读下这篇文章()

  如果你需要缓存其它不是HTTP Request的东西,你可以用NSCache。

  NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。 Mattt Thompson有一篇很棒的关于它的文章::http://nshipster.com/nscache/

  如果你对HTTP感兴趣可以读下Google的这篇 best-practices document on HTTP caching。

  11. 权衡渲染方法

  在iOS中可以有很多方法做出漂亮的按钮。你可以用整幅的图片,可调大小的图片,uozhe可以用CALayer, CoreGraphics甚至OpenGL来画它们。

  当然每个不同的解决方法都有不同的复杂程度和相应的性能。有一篇Apple UIKit team中的一员Andy Matuschak推荐过的很棒的关于graphic性能的帖子很值得一读。

  简单来说,是用事先渲染好的图片更快一些,因为如此一来iOS免去了创建一个图片再画东西上去然后显示在屏幕上的程序。问题是你需要把所有你需要用到的图片放到app的bundle里面,这样增加了体积 – 这是使用可变大小的图片更好的地方了: 你可以省去一些不必要的空间,也不需要再为不同的元素(比如按钮)来做不同的图。

  然而,使用图片也意味着你失去了使用代码调整图片的机动性,你需要一遍又一遍不断地重做他们,这样很浪费时间了,而且你如果要做一个动画效果,虽然每幅图只是一些细节的变化你需要很多的图片造成bundle大小的不断增大。

  总得来说,你需要权衡一下利弊,到底是要性能能还是要bundle保持合适的大小。

  12. 处理内存警告

  一旦系统内存过低,iOS会通知所有运行中app。在官方文档中是这样记述:

  如果你的app收到了内存警告,它需要尽可能释放更多的内存。佳方式是移除对缓存,图片object和其他一些可以重创建的objects的strong references.

  幸运的是,UIKit提供了几种收集低内存警告的方法:

  在app delegate中使用`applicationDidReceiveMemoryWarning:` 的方法

  在你的自定义UIViewController的子类(subclass)中覆盖`didReceiveMemoryWarning`

  注册并接收 UIApplicationDidReceiveMemoryWarningNotification 的通知

  一旦收到这类通知,你需要释放任何不必要的内存使用。

  例如,UIViewController的默认行为是移除一些不可见的view, 它的一些子类则可以补充这个方法,删掉一些额外的数据结构。一个有图片缓存的app可以移除不在屏幕上显示的图片。

  这样对内存警报的处理是很必要的,若不重视,你的app可能被系统杀掉。

  然而,当你一定要确认你所选择的object是可以被重现创建的来释放内存。一定要在开发中用模拟器中的内存提醒模拟去测试一下。

  13. 重用大开销对象

   一些objects的初始化很慢,比如NSDateFormatter和NSCalendar。然而,你又不可避免地需要使用它们,比如从JSON或者XML中解析数据。

  想要避免使用这个对象的瓶颈你需要重用他们,可以通过添加属性到你的class里或者创建静态变量来实现。

  注意如果你要选择第二种方法,对象会在你的app运行时一直存在于内存中,和单例(singleton)很相似。

  下面的代码说明了使用一个属性来延迟加载一个date formatter. 第一次调用时它会创建一个新的实例,以后的调用则将返回已经创建的实例:
 
// 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;
}