性能差异:loadNibNamed与编程方式



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

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

视图控制器的速度非常慢,所以我决定尝试用程序加载自定义uiview的项目。Våila,速度增加了约7倍。

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

编辑:我刚刚找到了这个链接,因此也找到了这个博客文章,它解释了从光盘加载xib文件的有趣之处。我想从光盘加载可以解释这种差异/K

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

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

如果你的观点相对简单,并且你相信它不会改变太多;然后Xib离开了。如果没有,我一直推荐程序化,因为它至少有3个大的好处:

1)您可以更深入地了解一切在幕后是如何工作的,如果出现问题,这将大大有助于调试

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

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

=>程序定义控制比使用XIB更耗时。因为要在飞行中创建所有控件和位置等。

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

=>我在读一些书,我想我发现了一些有利于程序的东西。事实证明,Xib文件隐式地使用imageNamed方法将图像加载到内存中,这有一个众所周知的缓存"功能",对内存来说是有问题的。我还听说IBOutlets是一个重要的内存管理问题。

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

1.什么都没学到

2.以后可能会在代码中引起严重问题

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

我在学习html、flex、swing和cocoatouch时也经历过同样的经历。。。一开始可能需要更长的时间,但一旦你理解了它并能够编写辅助类/方法,事情就会很快完成,对你有好处。

Just found some usefull information/tips about xib:

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

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

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

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

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

对于其他nib文件,将nib文件集中在关键对象上,例如要显示的单个窗口或面板。nib文件中的所有其他对象都应该便于该窗口或面板的即时操作。

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

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

但作为一名专业程序员(就像我是一名软件开发人员一样),我个人的观点是,初学者最好从编程的方式开始,只是为了学习和理解一切是如何工作的

相关内容

  • 没有找到相关文章

最新更新