25条提高iOSApp性能的建议和技巧

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

夏季解暑茶喝什么茶最好,电脑盘片当我们开发iOS应用时,好的性能对我们的App来说是很重要的。你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢就会让你得到不好的评论。然而,由于IOS设备的限制有时很难工作得很正确。我们开发时有很多需要我们记住这些容易忘记的决定对性能的影响。这是为什么我写这篇文章的原因。这篇文章用备忘录的形式集合了25个技巧和诀窍可以用来提高你的app性能。所以耐心的阅读来给你未来的App一个很不错的提高。Note:在优化代码之前,必须保证有个需要解决的问题!不要陷入pre-optimizing(预优化)你的代码。勤用Instruments分析你的代码,发现任何一个需要提高的地方。MattGalloway写了一个使用Instruments优化代码的的教程以下这些技巧分为三个不同那个的级别---基础,中级,高级。基础这些技巧你要总是想着实现在你开发的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.适当的设置背景图片(SetBackgroundImagesAppropriately)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的常用代码1UIView*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的时候调用这个方1NSString*CellIdentifier=@Cell;23UITableViewCell*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中的这个方法:1+(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),^{0203//switchtoabackgroundthreadandperformyourexpensiveoperation04050607dispatch_async(dispatch_get_main_queue(),^{0809//switchbacktothemainthreadtoupdateyourUI夏季解暑茶喝什么茶最好,电脑盘片});1415});这里为什么dispatch_async嵌套在第一个的里面?这是因为任何UIKit相关的代码都必须在主线程上执行。6)调整图像视图中的图像尺寸如果你用UIImageView呈现app束中的图片时,确认图片和UIImageView的尺寸相同。缩放图片会非常的耗时,特别是当你的UIImageView被嵌入UIScrollView。如果图片是从远程服务器上下载的,有时你没法控制图片尺寸,或者你不能在服务器上在下载之前缩放它。在这些情况下你可以在图片下载完成后手动缩放一次,最好是在后台进程中。然在UIImageView中使用调整尺寸之后的图片。7)选择正确集合学着怎么在手头工作中使用最合适的类或对象是写出高效代码的基本。当时用集合是(collections),这个说法特别对。可喜的是在苹果开发者文档(CollectionsProgrammingTopics)中有详细解释可用类之间的关系,还有解释各个类的适用情况。这个文档是每个使用集合的人的必读文档。这是一个最常见的集合类型的快速简介:Arrays:有序的值的列表,用index快速查找,通过值查找慢,insert/delete操作慢。Dictionaries:存储键/值对.用index快速查

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功