详解优化iOS程序性能的25个方法

2020-01-18 19:20:55于丽

我更喜欢用CALayer自己画一个阴影出来,这样可以设置阴影光栅化,节省大量CPU的运算,坏处就是比较消耗内存。因为如果给view的layer设置光栅化的话整个View都会变得模糊。 

20. 优化Table View

Table view需要有很好的滚动性能,不然用户会在滚动过程中发现动画的瑕疵。

为了保证table view平滑滚动,确保你采取了以下的措施:

 正确使用reuseIdentifier来重用cells  尽量使所有的view opaque,包括cell自身  避免渐变,图片缩放,后台选人  缓存行高  如果cell内现实的内容来自web,使用异步加载,缓存请求结果  使用shadowPath来画阴影  减少subviews的数量  尽量不使用cellForRowAtIndexPath:,如果你需要用到它,只用一次然后缓存结果  使用正确的数据结构来存储数据  使用rowHeight, sectionFooterHeight和 sectionHeaderHeight来设定固定的高,不要请求delegate

 21.选择正确的数据存储选项

当存储大块数据时你会怎么做?

你有很多选择,比如:

 使用NSUerDefaults  使用XML, JSON, 或者 plist  使用NSCoding存档  使用类似SQLite的本地SQL数据库  使用 Core Data

NSUserDefaults的问题是什么?虽然它很nice也很便捷,但是它只适用于小数据,比如一些简单的布尔型的设置选项,再大点你就要考虑其它方式了

XML这种结构化档案呢?总体来说,你需要读取整个文件到内存里去解析,这样是很不经济的。使用SAX又是一个很麻烦的事情。

NSCoding?不幸的是,它也需要读写文件,所以也有以上问题。

在这种应用场景下,使用SQLite 或者 Core Data比较好。使用这些技术你用特定的查询语句就能只加载你需要的对象。

在性能层面来讲,SQLite和Core Data是很相似的。他们的不同在于具体使用方法。Core Data代表一个对象的graph model,但SQLite就是一个DBMS。Apple在一般情况下建议使用Core Data,但是如果你有理由不使用它,那么就去使用更加底层的SQLite吧。

如果你使用SQLite,你可以用FMDB(https://www.easck.com/p>

NSAutoreleasePool负责释放block中的autoreleased objects。一般情况下它会自动被UIKit调用。但是有些状况下你也需要手动去创建它。

假如你创建很多临时对象,你会发现内存一直在减少直到这些对象被release的时候。这是因为只有当UIKit用光了autorelease pool的时候memory才会被释放。好消息是你可以在你自己的@autoreleasepool里创建临时的对象来避免这个行为:


NSArray *urls = <# An array of file URLs #>; 
 for(NSURL *url in urls) { 
 @autoreleasepool { 
  NSError *error; 
  NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 
  /* Process the string, creating and autoreleasing more objects. */ 
 } 
 }