【问题标题】:Difference in performance: loadNibNamed vs. programmatically性能差异:loadNibNamed 与编程方式
【发布时间】:2013-02-11 08:33:48
【问题描述】:

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

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

视图控制器的行为非常缓慢,因此我决定尝试以编程方式加载自定义 uiview 的项目。 Vòila,速度提高了大约 7 倍。

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

编辑: 我刚刚找到了this link,因此找到了this blogpost,它解释了关于何时从光盘加载 xib 文件的有趣事情。我想从光盘加载解释了差异。 /K

【问题讨论】:

  • 您可以在此处查看此性能测试:cocoawithlove.com/2010/03/…。它有点旧,但我认为仍然相关。另请阅读结论,也许您会发现为什么它在您的情况下如此缓慢
  • 今天刚好遇到这个问题。切换到以编程方式创建的 UIView,我可以看到快 5 倍。并且 Time Profile 停止将其注册为瓶颈。

标签: ios performance interface-builder loadnibnamed


【解决方案1】:

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

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

如果您的观点相对简单,并且您确信它不会改变太多;然后席布走了。如果没有,我建议一直以编程方式进行,因为它至少有 3 大好处:

1)您可以更深入地了解幕后一切的运作方式,如果出现问题,这将极大地帮助调试

2) 完全控制和自定义所有内容,因此如果有更改,很容易实施

3) 不那么混乱;这可能是个人喜好,但如果有很多从按钮调用的操作,我会发现界面构建器箭头之字形 hullabaloo 比编程更令人困惑。

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

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

=> 我正在阅读一些内容,我想我发现了一些可以以编程方式达成交易的东西。原来 Xib 文件隐式使用 imageNamed 方法将其图像加载到内存中,该方法具有众所周知的缓存“功能”,这对内存来说是有问题的。我还听说 IBOutlets 是一个重要的内存管理问题。

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

1.真的什么都学不到

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

一旦你了解了一切是如何运作的,使用这些小帮手就可以了……

我在学习 html、flex、swing 和 cocoa touch 时也经历过同样的事情……一开始可能需要更长的时间,但是一旦你理解了它并可以编写辅助类/方法,事情就会变得非常快,而且对你有好处。

Just found some usefull information/tips about xib:

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

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

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

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

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

对于其他 nib 文件,请将 nib 文件集中在一个关键对象上,例如您要显示的单个窗口或面板。然后,nib 文件中的所有其他对象应有助于立即操作该窗口或面板。

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

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

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

【讨论】:

  • 也许您可以专注于性能影响,这看起来像是一般的反接口构建器博客文章,而我对性能影响看不到太多。
  • @CarlVeazey。这是性能(也是速度)的基本点。首先阅读它然后放弃投票...了解。
  • @iPatel。谢谢你的帖子。有点冗长和混乱,但你陈述了一些有趣的观点,我可能会更深入地研究。
  • @kjoelbro-hahaa,我知道它很长..但它可能对初学者有帮助..谢谢:)
  • 如果它是一个生命周期很长的项目,需要很多开发人员一起工作,那么使用 xibs 会更好,因为它不会那么混乱
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2011-10-30
  • 2021-02-03
  • 2012-02-11
  • 2020-10-15
  • 2011-12-17
相关资源
最近更新 更多