我的编程空间,编程开发者的网络收藏夹
学习永远不晚

iOS程序性能优化的技巧

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

iOS程序性能优化的技巧

1. 用ARC管理内存

ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动干预了。忘掉代码段结尾的release简直像记得吃饭一样简单。而ARC会自动在底层为你做这些工作。除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。

2.尽量把views设置为透明

如果你有透明的Views你应该设置它们的opaque属性为YES。

原因是这会使系统用一个最优的方式渲染这些views。这个简单的属性在IB或者代码里都可以设定。

Apple的文档对于为图片设置透明属性的描述是:

(opaque)这个属性给渲染系统提供了一个如何处理这个view的提示。如果设为YES,渲染系统就认为这个view是完全不透明的,这使得渲染系统优化一些渲染过程和提高性能。如果设置为NO,渲染系统正常地和其它内容组成这个View。默认值是YES。

在相对比较静止的画面中,设置这个属性不会有太大影响。然而当这个view嵌在scroll view里边,或者是一个复杂动画的一部分,不设置这个属性的话会在很大程度上影响app的性能。

你可以在模拟器中用Debug\Color Blended Layers选项来发现哪些view没有被设置为opaque。目标就是,能设为opaque的就全设为opaque!

这里有一点需要注意,只要是有中文字符的Label,哪怕你设置成不透明,模拟器中这个Label依然会变红,这个猜测是字符绘制的时候出的问题,这个目前没找到好的解决方法。

3.避免过于庞大的XIB

iOS5中加入的Storyboards(分镜)正在快速取代XIB。然而XIB在一些场景中仍然很有用。比如你的app需要适应iOS5之前的设备,或者你有一个自定义的可重用的view,你就不可避免地要用到他们。

如果你不得不XIB的话,使他们尽量简单。尝试为每个Controller配置一个单独的XIB,尽可能把一个View Controller的view层次结构分散到单独的XIB中去。

需要注意的是,当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard仅在需要时实例化一个view controller.

当家在XIB是,所有图片都被chache,如果你在做OS X开发的话,声音文件也是。Apple在相关文档中的记述是:

当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。取决于你所在的平台,使用NSImage 或UIImage的imageNamed:方法来获取图片资源。

这个问题我深有体会,用xib写的界面加载速度比直接用代码写的要慢好多

4. 在Image Views中调整图片大小

如果要在UIImageView中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是UIImageView嵌套在UIScrollView中的情况下。

如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好是用background thread,缩放一次,然后在UIImageView中使用缩放后的图片。

5. 选择正确的Collection

学会选择对业务场景最合适的类或者对象是写出能效高的代码的基础。当处理collections时这句话尤其正确。

一些常见collection的总结:

Arrays: 有序的一组值。使用index来lookup很快,使用value lookup很慢,插入/删除很慢。

Dictionaries: 存储键值对。用键来查找比较快。

Sets: 无序的一组值。用值来查找很快,插入/删除很快。因为Set用到了哈希,所以插入删除查找速度比Array快很多

6. 打开gzip压缩

大量app依赖于远端资源和第三方API,你可能会开发一个需要从远端下载XML, JSON, HTML或者其它格式的app。

问题是我们的目标是移动设备,因此你就不能指望网络状况有多好。一个用户现在还在edge网络,下一分钟可能就切换到了3G。不论什么场景,你肯定不想让你的用户等太长时间。

减小文档的一个方式就是在服务端和你的app中打开gzip。这对于文字这种能有更高压缩率的数据来说会有更显著的效用。

好消息是,iOS已经在NSURLConnection中默认支持了gzip压缩,当然AFNetworking这些基于它的框架亦然。像Google App Engine这些云服务提供者也已经支持了压缩输出。

7. 重用和延迟加载(lazy load) Views

更多的view意味着更多的渲染,也就是更多的CPU和内存消耗,对于那种嵌套了很多view在UIScrollView里边的app更是如此。

这里我们用到的技巧就是模仿UITableView和UICollectionView的操作:不要一次创建所有的subview,而是当需要时才创建,当它们完成了使命,把他们放进一个可重用的队列中。

这样的话你就只需要在滚动发生时创建你的views,避免了不划算的内存分配。

创建views的能效问题也适用于你app的其它方面。想象一下一个用户点击一个按钮的时候需要呈现一个view的场景。有两种实现方法:

  1. 创建并隐藏这个view当这个screen加载的时候,当需要时显示它;
  2. 当需要时才创建并展示。

每个方案都有其优缺点。用第一种方案的话因为你需要一开始就创建一个view并保持它直到不再使用,这就会更加消耗内存。然而这也会使你的app操作更敏感因为当用户点击按钮的时候它只需要改变一下这个view的可见性。

第二种方案则相反-消耗更少内存,但是会在点击按钮的时候比第一种稍显卡顿。

8.权衡渲染方法

在iOS中可以有很多方法做出漂亮的按钮。你可以用整幅的图片,可调大小的图片,或者可以用CALayer, CoreGraphics甚至OpenGL来画它们。当然每个不同的解决方法都有不同的复杂程度和相应的性能。

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

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

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

9.处理内存警告

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

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

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

在app delegate中使用applicationDidReceiveMemoryWarning:的方法

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

注册并接收 UIApplicationDidReceiveMemoryWarningNotification的通知

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

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

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

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

当然,现在iOS设备运行内存越来越大,这一点很难出现了

10. 使用Sprite Sheets

Sprite sheet可以让渲染速度加快,甚至比标准的屏幕渲染方法节省内存。

11.避免反复处理数据

许多应用需要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要。在内存中操作数据使它们满足你的数据结构是开销很大的。

比如你需要数据来展示一个table view,最好直接从服务器取array结构的数据以避免额外的中间数据结构改变。

类似的,如果需要从特定key中取数据,那么就使用键值对的dictionary。

这一点在处理大量数据的时候极为重要,用空间换时间的方法也许是极好的。

12.选择正确的数据格式

从app和网络服务间传输数据有很多方案,最常见的就是JSON和XML。你需要选择对你的app来说最合适的一个。

解析JSON会比XML更快一些,JSON也通常更小更便于传输。从iOS5起有了官方内建的JSON deserialization就更加方便使用了。

但是XML也有XML的好处,比如使用SAX来解析XML就像解析本地文件一样,你不需像解析json一样等到整个文档下载完成才开始解析。当你处理很大的数据的时候就会极大地减低内存消耗和增加性能。

以上就是iOS程序性能优化的建议的详细内容,更多关于ios 程序性能优化的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

iOS程序性能优化的技巧

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

iOS程序性能优化的技巧

1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,
2022-05-15

PHP 应用程序性能优化中 Composer 的性能优化技巧

composer 优化技巧:禁用自动加载,避免在编译时加载不必要的类。使用 composer optimize 命令生成优化文件,减少加载类的时间。限制依赖项更新,避免频繁重新生成锁定文件。通过这些优化,可以大幅提升 php 应用程序的性能
PHP 应用程序性能优化中 Composer 的性能优化技巧
2024-05-01

iOS开发教程之常见的性能优化技巧

前言 性能问题的主要原因是什么,原因有相同的,也有不同的,但归根到底,不外乎内存使用、代码效率、合适的策略逻辑、代码质量、安装包体积这一类问题。但从用户体验的角度去思考,当我们置身处地得把自己当做用户去玩一款应用时候,那么都会在意什么呢?假
2022-06-02

Java程序性能优化的编程技巧有哪些

本篇内容主要讲解“Java程序性能优化的编程技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java程序性能优化的编程技巧有哪些”吧!1、慎用异常在Java软件开发中,经常使用 try-
2023-06-17

Golang应用程序性能优化技巧分享

随着科技的进步,人人都想要快速的应用,这就需要优化您的应用程序性能。本文为大家整理了一些Golang应用程序性能优化的技巧,希望对大家有所帮助
2023-05-15

PHP 应用程序性能优化中 OPcache 配置的优化技巧

通过优化 opcache 配置,可以提升 php 应用程序性能。优化包括:设置合理的 opcache.memory_consumption 大小提高 opcache.max_accelerated_files 数值启用 opcache.re
PHP 应用程序性能优化中 OPcache 配置的优化技巧
2024-05-01

Golang应用程序性能优化技巧有哪些

这篇文章主要讲解了“Golang应用程序性能优化技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang应用程序性能优化技巧有哪些”吧!一、概述随着科技的进步,人人都想要快速的应
2023-07-06

Node.js OAuth:性能优化技巧

Node.js OAuth 性能优化技巧对于优化 Node.js 应用性能至关重要。通过实施这些技巧,开发人员可以提高 OAuth 请求的效率,从而缩短响应时间和改善用户体验。
Node.js OAuth:性能优化技巧
2024-02-19

PHP 性能优化:内存优化技巧

内存管理对 php 性能优化至关重要。优化内存使用可以通过以下技巧实现:使用高效的数据结构,如数组而非链表。避免不必要的内存拷贝,使用引用 (&) 或赋值 (=) 进行变量传递。监控内存使用情况,使用 xdebug 等工具检测泄漏。优化字符
PHP 性能优化:内存优化技巧
2024-05-10

Golang文件读取优化:提升程序性能的小技巧

Golang是一门以高效和快速著称的编程语言,但在文件读取方面,如果不小心就会陷入性能瓶颈。本文将讨论Golang中文件读取的优化,介绍能够提升程序性能的小技巧,并附带具体的代码示例。使用缓冲区在Golang中,文件读取时每读一个字节都
Golang文件读取优化:提升程序性能的小技巧
2024-01-19

PHP 应用程序性能优化中的请求处理技巧

php 应用程序中优化请求处理包含 3 个关键技巧:利用缓存机制存储经常请求的数据。优化数据库查询,包括使用索引、限制查询大小和利用 join。减少 http 请求,通过合并 css sprites 和图像合并等技术。PHP 应用程序性能优
PHP 应用程序性能优化中的请求处理技巧
2024-05-05

PHP代码性能优化的技巧

本篇内容主要讲解“PHP代码性能优化的技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP代码性能优化的技巧”吧!PHP代码性能优化1. 不要随便就复制变量有时候为了使 PHP 代码更加整洁
2023-06-17

优化MySQL视图的性能技巧

标题:优化MySQL视图的性能技巧MySQL视图是一种虚拟的表,它是一个基于查询结果的表。在实际开发中,我们经常会使用视图来简化复杂的查询操作,提高代码的可读性和维护性。然而,当数据量较大或者视图的复杂度较高时,视图的性能可能会受到影响。
优化MySQL视图的性能技巧
2024-03-15

Node.js 中的 WebSocket 性能优化技巧

提升 Node.js WebSocket 性能的优化技巧
Node.js 中的 WebSocket 性能优化技巧
2024-03-01

nodejs的10个性能优化技巧

下面是我们使用Node.js时遵循的10个性能规则: 1. 避免使用同步代码 在设计上,Node.js是单线程的。为了能让一个单线程处理许多并发的请求,你可以永远不要让线程等待阻塞,同步或长时间运行的操作。Node.js的一个显著特征是:它
2022-06-04

Go并发编程中的性能优化技巧

go 并发编程的性能优化技巧包括:使用 goroutine 池来避免创建和销毁 goroutine 的开销。使用 channels 传递数据,而不是共享内存,以防止数据竞争。避免使用繁重的锁,并考虑使用无锁数据结构来减少竞争。并行执行任务,
Go并发编程中的性能优化技巧
2024-05-12

PHP 函数性能优化技巧

php函数性能优化技巧包括:避免不必要的对象创建;减少函数调用次数;使用函数缓存;优化数据库查询;使用第三方工具分析和优化性能。PHP 函数性能优化技巧PHP 函数的性能优化至关重要,因为它可以大幅提升应用程序的响应速度。本文将介绍几个实
PHP 函数性能优化技巧
2024-04-12

Python 性能优化技巧总结

1.使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile、cProfile、hotshot等,memory_profiler用了psutil,所以不能跟踪cpython的扩展; 2.
2022-06-04

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录