2013-02-11 40 views
6

我有一个视图控制器,包含许多自定义UIViews。的UIView我尝试使用的InterfaceBuilder(IB)内initWithFrame使用此代码来定义它,并加载自定义:差异表现在:loadNibNamed与编程

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

视图控制器表现极为缓慢,所以我决定尝试加载自定义的UIView的项目编程。瞧,速度提高了约7

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

有什么想法?

谢谢!

编辑: 我刚刚发现this link,因此this blogpost解释了何时从光盘加载xi​​b文件有趣的事情。我想从光盘加载解释不同。/K

+1

您可以检查这个性能测试在这里:http://www.cocoawithlove.com/2010/03/load-from-nib-or-construct-views-in.html。它有点旧,但我认为仍然相关。也请阅读结论,也许你会发现为什么它在你的情况下如此缓慢 – Mindaugas 2013-02-11 09:57:20

+0

我刚碰巧遇到这个问题今天。切换到以编程方式创建的UIView,我可以看到约5倍的速度。 Time Profile停止将其注册为瓶颈。 – user523234 2013-04-07 22:33:03

回答

5

这是某些时候,我得到了,也从我的经验,谷歌发现。

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

如果你的观点是比较简单的,并且你确信它不会有太大改变它;然后Xib走了。如果没有,我编程建议所有的方式,因为它至少有3个大好处:

1)你得到的一切是如何工作的场面,这大大有助于调试,如果有问题背后的更深层次的知识

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

3)减少混乱;这可能是个人喜好,但如果有大量的动作从按钮被调用,这样我觉得Interface Builder的箭头曲折喧嚣很多比编程更加混乱。

=>按步骤定义控件是比较费时的过程,然后使用XIB。因为在飞行中创建所有的控件和位置等。

=>我也注意到,与加载视图中的文件以编程方式使用大约一半的辅助存储器为厦门国际银行文件。我不知道这转化为更大的应用程序,但它可能是在啤酒的应用考虑

=>我在做一些阅读,我想我找到了那种密封处理赞成编程。原来,厦门国际银行文件隐含使用imageNamed方法向自己的图片加载到内存中,其中有一个众所周知的缓存“功能”是内存问题。我还听说IBOutlets是一个重要的内存管理问题。

所有这些接口建设者们非常非常好的工具,但如果你不知道你在做什么,你不知道这些工具做你

1并不真正学到东西

2。可能会导致你的代码的严重问题后

,一旦你了解一切是如何工作的完全正常使用这些小帮手......

在学习html,flex,swing和cocoa touch时,我经历了同样的过程......开始时它可能需要更长的时间,但是一旦你理解了它并且可以编写帮助程序类/方法,那么这些工作将会非常快速和良好为你。

Just found some usefull information/tips about xib: 

保持你的笔尖文件小 在Xcode配备一个或两个预配置的笔尖文件大多数新项目。许多新开发界面生成器的开发人员犯的一个错误是将其应用程序的所有窗口和菜单放在这一个或两个nib文件中。错误的原因通常是方便的。 (模板项目通常会自动加载预配置的nib文件,这使开发人员无需添加更多的nib加载代码。)不幸的是,依赖这种便利性通常会导致性能降低并增加应用程序的内存压力。

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

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

对于您的应用程序的主笔尖文件,只包括您的菜单栏(或者在iPhone应用程序的情况下,只是主窗口)。

对于Mac OS X中的文档笔尖文件,只包括文档窗口和显示该窗口所需的对象(如控制器)。

对于其他笔尖文件,请将笔尖文件放在关键物体上,例如您打算显示的单个窗口或面板。然后,nib文件中的所有其他对象都应该便于该窗口或面板的即时操作。

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

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

但我个人认为作为一个专业的程序员(如我是一个软件开发者)是它的总是最好的初学者开始与的程序化的方式只是为了学习和了解如何一切正常

+2

也许你可以专注于性能的含义,这就像一个一般的反界面构建器博客文章,我没有看到太多的性能影响。 – 2013-02-11 10:02:38

+0

@CarlVeazey。这是性能(也是速度)的基本点。先读它然后放弃...投票。 – iPatel 2013-02-11 10:05:32

+0

@iPatel。感谢您的发布。有点漫长而杂乱,但是你陈述了一些我可能会深入研究的有趣点。 – kjoelbro 2013-02-11 12:19:19