gpt4 book ai didi

ios - 性能差异 : loadNibNamed vs. 以编程方式

转载 作者:可可西里 更新时间:2023-11-01 03:31:50 26 4
gpt4 key购买 nike

我有一个 View Controller ,其中包含许多自定义 UIView。我尝试使用 InterfaceBuilder (IB) 定义自定义 UIView,并使用以下代码在 initWithFrame 中加载它:

NSArray *xib=[[NSBundle mainBundle] loadNibNamed:@"DayView" owner:self options:nil];

View Controller 的运行速度非常慢,所以我决定尝试以编程方式加载自定义 uiview 的项目。瞧,速度提高了大约 7 倍。

为什么加载 XIB 文件和使用“干净”代码之间的差异如此之大?我能想到的第一个假设是 IB 默认设置了很多属性,而在代码中定义它们时它们只是为零。但它无法解释巨大的性能差异!我还没有发现任何帖子明确警告您不要出于性能原因使用 IB。

编辑:
我刚找到 this link因此 this blogpost这解释了有关何时从光盘加载 xib 文件的有趣内容。我猜从光盘加载解释了差异。/K

最佳答案

这是我从我的经验和谷歌中得到并发现的一些观点。

=> I've done it both ways and here's my two sense:

如果您的 View 相对简单,并且您确信它不会有太大变化;然后Xib走了。如果没有,我一直推荐以编程方式,因为它至少有 3 个大的好处:

1) 您对幕后的工作原理有更深入的了解,如果出现问题,这将极大地帮助调试

2) 完全控制和定制一切,所以如果有变化很容易实现

3) 不那么困惑;这可能是个人偏好,但如果有很多从按钮调用的操作,我发现界面构建器箭头 zig-zag hullabaloo 比以编程方式更令人困惑。

=> 以编程方式定义控制是比使用 XIB 更耗时的过程。因为要即时创建所有控件和位置等。

=> 我还注意到与以编程方式加载 View 相关的文件使用的辅助内存大约是 xib 文件的一半。我不确定这是否会转化为更大的应用程序,但在更大的应用程序中可能需要考虑

=> 我正在做一些阅读,我想我找到了某种方式以编程方式达成交易。结果是 Xib 文件隐式地使用 imageNamed 方法将它们的图像加载到内存中,该方法具有众所周知的缓存“功能”,这对内存来说是有问题的。我还听说 IBOutlets 是一个重要的内存管理问题。

所有这些界面构建器都是非常好的工具,但是如果您不知道自己在做什么并且不知道这些工具在做什么,那么您

1.真的什么都没学

2. 以后可能会导致你的代码出现严重问题

一旦你了解了一切是如何工作的,就可以很好地使用这些小 helper ......

我在学习 html、flex、swing 和 cocoa touch 时也经历过同样的事情……一开始可能需要更长的时间,但是一旦你理解了它并且可以编写帮助类/方法,事情就会非常快速并且对你有好处.
Just found some usefull information/tips about xib:

保持你的 Nib 文件小
Xcode 中的大多数新项目都带有一两个预配置的 nib 文件。许多不熟悉 Interface Builder 的开发人员犯的一个错误是将所有应用程序的窗口和菜单放在这一个或两个 nib 文件中。错误的原因往往是方便。 (模板项目通常会自动加载预配置的 nib 文件,这使开发人员不必添加更多的 nib 加载代码。)不幸的是,依赖这种便利通常会导致性能下降并增加应用程序的内存压力。

当一个 nib 文件被加载到内存中时,这是一个全有或全无的努力。 nib 加载代码无法知道文件中有多少对象或哪些对象是重要的,因此必须将整个文件加载到内存中。然后从这个内存数据中实例化单个对象。对于 Cocoa 和 iPhone 应用程序,nib 文件中的所有对象都会立即实例化,以便可以重新建立导出和 Action 连接。如果您的应用程序最初只使用一些 nib 文件对象,那么将所有对象都放在内存中是一种浪费。

对于所有项目,最好设计每个 nib 文件,使其仅包含在给定情况下立即需要的那些对象。当加载到内存中时,这样的 nib 文件使用尽可能少的内存,同时仍然拥有完成工作所需的一切。以下是组织 nib 文件时需要考虑的一些设计选择:

对于应用程序的主 nib 文件,仅包含菜单栏(或者在 iPhone 应用程序的情况下,仅包含主窗口)。

对于 Mac OS X 中的文档 nib 文件,仅包含文档窗口和显示该窗口所需的对象(例如 Controller )。

对于其他 nib 文件,将 nib 文件聚焦在关键对象上,例如您打算显示的单个窗口或面板。然后,nib 文件中的所有其他对象应便于立即操作该窗口或面板。

对于更改其嵌入 View 层次结构的窗口,如果层次结构不经常更改,请考虑将任何其他层次结构存储在单独的 nib 文件中。仅在使用时加载每个 View 层次结构。

如果你已经有很大的 nib 文件,你可以使用 Interface Builder 的重构工具将它们分解成几个较小的 nib 文件。有关如何使用 Interface Builder 的重构工具的信息,请参阅“重构 Nib 文件”。有关如何从代码中显式加载 nib 文件的信息,请参阅资源编程指南。

但我个人认为,作为一名专业程序员(就像我是一名软件开发人员),对于初学者来说,从编程方式开始学习和理解一切如何运作总是更好

关于ios - 性能差异 : loadNibNamed vs. 以编程方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14808418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com