25条提高iosapp性能的建议和技巧文档格式.docx
《25条提高iosapp性能的建议和技巧文档格式.docx》由会员分享,可在线阅读,更多相关《25条提高iosapp性能的建议和技巧文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
以下这些技巧分为三个不同那个的级别---基础,中级,高级。
基础
这些技巧你要总是想着实现在你开发的App中。
1.
用ARC去管理内存(UseARCtoManageMemory)
2.适当的地方使用reuseIdentifier(UseareuseIdentifierWhereAppropriate)
3.尽可能设置视图为不透明(SetViewasOpaqueWhenPossible)
4.避免臃肿的XIBs(AvoidFatXiBs)
5.不要阻塞主进程(Don'
tBlocktheMainThread)
6.调整图像视图中的图像尺寸(SizeImagestoImageViews)
7.选择正确集合(ChoosetheCorrectCollection)
8.启用Gzip压缩(EnableGZIPCompression)
中级
这些技巧是当你遇到更复杂的情况的时候使用。
9.重用和延迟加载视图(ReuseandLazyLoadViews)
10.缓存,缓存,缓存(Cache,Cache,Cache)
11.考虑绘图(ConsiderDrawing)
12.处理内存警告(HandleMemoryWarnings)
13.重用大开销对象(ReuseExpensiveObjects)
14.使用精灵表(UseSpriteSheets)
15.避免重复处理数据(AvoidRe-ProcessingData)
16.选择正确的数据格式(ChoosetheRightDataFormat)
17.适当的设置背景图片(Set
BackgroundImagesAppropriately)
18.减少你的网络占用(ReduceYourWebFootprint)
19.设置阴影路径(SettheShadowPath)
20.你的表格视图OptimizeYourTableViews)
21.选择正确的数据存储方式(ChooseCorrectDataStorageOption)
高级
这些技巧你应该只在你很积极认为它们能解决这个问题,而且你觉得用它们很舒适的时候使用。
22.加速启动时间(SpeedupLaunchTime)
23.使用自动释放池(UseAutoReleasePool)
24.缓存图像(CacheImages-Ornot
)
25.尽可能避免日期格式化器(AvoidDateFormattersWherePossible)
没有其他的,一起去看看这些技巧吧!
基础的性能提升
1)用ARC去管理内存
ARC是伴随IOS5一起发布的,它用来消除常见的的内存泄漏。
ARC是"
AutomaticReferenceCounting"
的缩写。
它自动管理你代码中的retain/release循环,这样你就不必手动做这事儿了。
下面这段代码展示了创建一个view的常用代码
1
UIView*view=[[UIViewalloc]init];
2
//...
3
[self.viewaddSubview:
view];
4
[viewrelease];
这里极其容易忘记在代码结束的地方调用release,ARC将会自动的,底层的为你做这些工作。
除了帮助你你避免内存泄漏,ARC还能保证对象不再使用时立马被回收来提高你的性能。
你应该在你的工程里多用ARC。
这里是一些学习更多关于ARC的非常棒的资源
值得注意的是ARC不能消除所有的内存泄漏。
你依然有可能内存泄漏,这主要可能是由于blocks(块),引用循环,CoreFoundation对象管理不善(通常是C结构体,或者是确实很糟糕的代码)。
2)适当的地方使用reuseIdentifier
在app开发中的一个常见的为UITableViewCells,UICollectionViewCells,UITableViewHeaderFooterViews设置一个正确的reuseIdentifier(重用标识)。
为了最大化性能,一个tableView的数据源一般应该重用UITableViewCell对象,当它在tableView:
cellForRowAtIndexPath:
中分配数据给cells的时候。
一个表视图维护了一个UITableViewCell对象的队列或者列表,这些对象已被数据源标记为重用。
如果你不用reuseIdentifier会怎么样呢?
如果你用,你的tableview每显示一行将会配置一个全新的cell。
这是非常费事的操作而且绝对会影响你app滚动的性能。
自从引进了iOS6,你应该为headerandfooter视图设置reuseIdentifiers,就像在UICollectionView’scells和supplementaryviews(补充视图)一样。
使用reuseIdentifiers,当你的数据源要求提供一个新的cell给tableview的时候调用这个方
NSString*CellIdentifier=@"
Cell"
;
2
UITableViewCell*cell=[tableViewdequeueReusableCellWithIdentifier:
CellIdentifierforIndexPath:
indexPath];
3)可能的时候设置视图为不透明
如果你有不透明视图(opaqueviews)--也就是说,没有透明度定义的视图,你应该设置他们的opaque属性为YES。
为什么?
这会允许系统以最优的方式绘制你的views。
这是一个简单的属性可以在InterfaceBuilder和代码中设置。
这个属性提供了一个提示给图系统如何对待这个视图。
如果设置为YES,绘制系统将会把这个视图视为完全不透明。
这样允许系统优化一些绘制操作和提高性能。
如果设置为NO,绘图系统会复合这个视图和其他的内容,这个属性的默认值是YES
在相对静态的屏幕上,设置opaque属性不会有什么大问题。
尽管如此,如果你的视图是嵌入在一个scrollView,或者是一个复杂的动画的一部分,不设置这个属性绝对会影响你的程序的性能。
你也可以使用Debug\ColorolorBlendedLayers选项在你的模拟器中形象化的看见没有设置为不透明(opaque)的视图.你的目标应该是尽可能多的设置视图为透明。
4)
避免臃肿的XIB文件
故事板,由iOS5引进,很快的替代XIBs。
尽管如此,XIBs在一下情况下依然是很有用的。
如果你需要在IOS5之前版本的设备上运行或者你想自定义重用的视图,那么你确实不能避免使用它们。
如果你专注使用XIBs,那么让它们尽量的简单。
尝试为一个试图控制器创建一个XIB,如果可能的话,把一个视图控制器的视图分层管理在单独的XIBs中。
注意当你加载一个XIB到内存的时候,它所有的内容都会载入内存,包括所有的图片。
如果你有视图但不是要立即使用,那你就浪费了珍贵的内存。
值得注意的是这不会发生在故事板中,因为故事版只会在需要的时候实例化一个视图控制器。
当你载入一个xib,所有的图像文件会被缓存,如果是开发OSX,那么音频文件也会被缓存。
如是说:
当你载入一个包含了图和声音资源引用的nib文件时,nib加载代码读取实际的图片文件和音频文件到内存中并缓存它。
在OSX中,图片和音频资源被存储在已命名的缓存中这样你可以在之后需要的时候访问它们。
在iOS中,只有图片资源被缓存,访问图片,你使用NSImage或者UIImage的imageNamed:
方法来访问,具体使用取决于你的平台。
显然这也发生在使用故事板的时候。
尽管如此,我还不能找到这种说法的证据。
如果你知道,请给我留言。
想学习更多关于故事板的更多内容吗?
看看MatthijsHollemans的
5)不要阻塞主进程
你永远不应该在主线程中做任何繁重的工作。
这是因为UIKIt的所有工作都在主线程中进行,比如绘画,管理触摸,和响应输出。
你的app的所有工作都在主线程上进行就会有阻塞主线程的风险,你的app会表现的反应迟钝。
这是在AppStore里获一星评论的快速途径!
(作者卖萌..)
阻塞主线程最多的情况就是发生在你的app进行I/O操作,包括牵扯到任何需要读写外部资源的任务,比如读取磁盘或者网络
你可以异步的执行网络任务使用NSURLConnection中的这个方法:
+(void)sendAsynchronousRequest:
(NSURLRequest*)requestqueue:
(NSOperationQueue*)queuecompletionHandler:
(void
(^)(NSURLResponse*,NSData*,NSError*))handler
或者使用第三方框架比如
AFNetworking.
如果你在做任何大开销的操作(比如执行一个耗时的计算,或者读写磁盘)使用GrandCentralDispatch(GCD)或者NSOperations和NSOperationQueues.
使用GCD的模板如下代码所示:
01dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
02
03
//switchtoabackgroundthreadandperformyourexpensiveoperation
04
05
06
07
dispatch_async(dispatch_get_main_queue(),^{
08
09
//switchbacktothemainthreadtoupdateyourUI
10
11
12
13
});
14
15
这里为什么dispatch_async嵌套在第一个的里面?
这是因为任何UIKit相关的代码都必须在主线程上执行。
6)调整图像视图中的图像尺寸
如果你用UIImageView呈现app束中的图片时,确认图片和UIImageView的尺寸相同。
缩放图片会非常的耗时,特别是当你的UIImageView被嵌入UIScrollVie