|
|
51CTO旗下网站
|
|
移动端

iOS 注意事项

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍iOS 注意事项。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 17:58

iOS 注意事项

正如我们注意到的那样,iOS 与macOS 的一个很大区别就是缺乏内存交换机制:应用性能并不会逐步下滑,而是直接撞上南墙。然而,不变的是内存子系统的流动性,这些要素使得iOS 成为了一个具有挑战性的环境。

一方面,如果向系统请求内存的手段过于激进(过快),或者在请求内存后放弃得太慢,那么进程将被移除。另一方面,如果系统预留足够的内存来检查内存状态,并且只使用可用内存的话,那么应用在系统上通常不会正常运转。

例如内存警告,它会在主线程上进行传递。这意味着如果应用在主线程进入了忙碌状态(无论是否正在分配内存),这时发生了内存警告的话,那么应用可能会被标记为无响应状态,然后就会被移除。此外,将内存分配操作移到后台线程中运行也无济于事。我看到过这种情况:线程尝试在前台处理内存警告时,后台线程还在大块大块地分配内存,这个时候应用就被移除了。

我发现的一个解决方案是,对于存在大量内存分配需求的后台线程,需要向主线程“ping”一条“do-nothing”的消息。(使用performSelector:onMainThread:类消息,其中将waitUnitDone 的标识位设置为YES。)如果主线程在处理内存警告,那么这条语句会阻塞后台线程中的内存分配操作,并允许在恢复操作之前将内存释放掉。说到内存警告,有一点要注意:当接收到内存警告时,请将正在做的大部分事情停掉,然后开始进行内存释放。

由于iOS 并不能将脏页面调出到磁盘中,所以这意味着需要保持内存的清洁(比如通过映射的方式),而这一点在iOS 上的重要性远超过macOS。尽管iOS 系统无法进行内存交换,但是它仍然可以强制将所有这些页面从内存中清除,然后在下次需要的时候再让系统去读取,因此系统仍然会和macOS 一样,在遇到内存压力时会减慢系统速度。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

嬴在用户:Web人物角色创建和应用实践指南

您如何保证您的网站确实给予用户他们所需要的,并对您产生商业成果?您需要了解谁是您的用户,您的用户的目标、行为和观点是什么,还要把他...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊