性能差异:loadNibNamed与编程方式

kjo*_*bro 7 performance interface-builder ios loadnibnamed

我有一个viewcontroller,它包含许多自定义UIViews.自定义UIView我尝试使用InterfaceBuilder(IB)定义它,并使用以下代码将其加载到initWithFrame中:

NSArray *xib=[[NSBundle mainBundle] loadNibNamed:@"DayView" owner:self options:nil];
Run Code Online (Sandbox Code Playgroud)

视图控制器表现得非常慢,所以我决定尝试以编程方式加载自定义uiview的项目.Vòila,速度增加了约7倍.

加载XIB文件和使用"干净"代码之间的区别是如此之大?我可以想到的第一个假设是IB默认设置了很多属性,而在代码中定义它们时它们只是nil.但它无法解释巨大的性能差异!我没有发现任何明确警告你不要使用性能原因的IB的帖子.

编辑:我刚刚找到这个链接,因此这个博客文章解释了有关何时从光盘加载xi​​b文件的有趣的事情.我想从光盘加载解释了差异./ K

iPa*_*tel 5

这是我得到的一些观点,也是从我的经验和谷歌中找到的.

=> I've done it both ways and here's my two sense:
Run Code Online (Sandbox Code Playgroud)

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

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

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

3)减少混乱; 这可能是个人偏好,但如果从按钮调用很多动作,我发现界面生成器箭头zig-zag hullabaloo比编程更混乱.

=> progmatically定义控制是一个更耗时的过程,然后使用XIB.因为要动态创建所有控件和位置等.

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

=>我正在做一些阅读,我认为我找到了一些类似于以编程方式支持交易的东西.事实证明,Xib文件隐式使用imageNamed方法将其图像加载到内存中,该内存具有众所周知的缓存"功能",这对内存有问题.另外我听说IBOutlets是一个重要的内存管理问题.

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

1.什么都不学

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

一旦你了解了一切如何运作它完全可以使用那些小帮手......

我在学习html,flex,swing和cocoa touch时也经历了同样的事情......一开始可能需要更长的时间但是一旦你理解了它并且可以编写帮助类/方法,事情将会非常快速地对你有用.

Just found some usefull information/tips about xib:
Run Code Online (Sandbox Code Playgroud)

保持您的Nib文件很小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文件的信息,请参阅"资源编程指南".

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

  • 也许您可以专注于性能含义,这就像一般的反接口构建器博客文章,我没有看到很多性能影响. (3认同)