首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性能差异: loadNibNamed与编程

性能差异: loadNibNamed与编程
EN

Stack Overflow用户
提问于 2013-02-11 08:33:48
回答 1查看 3.6K关注 0票数 8

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

代码语言:javascript
复制
NSArray *xib=[[NSBundle mainBundle] loadNibNamed:@"DayView" owner:self options:nil];

视图控制器表现得非常慢,所以我决定尝试以编程方式加载自定义uiview的项。速度提高了大约7倍。

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

编辑:我刚刚找到了此链接,因此找到了这个博客,这解释了xib文件何时从磁盘加载的有趣的事情。我想从磁盘加载可以解释两者的区别。/K

EN

回答 1

Stack Overflow用户

发布于 2013-02-11 09:56:39

,这是我从我的经验和google.中得到的一些观点。

代码语言:javascript
复制
=> I've done it both ways and here's my two sense:

如果您的观点相对简单,并且您确信它不会改变太多,那么Xib就离开了。如果没有,我一直建议采用编程方式,因为它至少有3大好处:

1)您获得了更深入的知识,了解在幕后一切如何工作,如果存在问题,这将极大地帮助调试。

2)完成了对所有事物的控制和定制,因此如果有更改,就很容易实现。

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

=>按进度定义控件比使用XIB要费时。因为要动态创建所有控件和位置等。

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

=>,我当时正在读一些书,我想我找到了一些东西,可以用编程的方式来封杀这笔交易。结果,Xib文件隐式地使用imageNamed方法将它们的图像加载到内存中,内存中有一个众所周知的缓存“特性”,这对内存来说是有问题的。我还听说IBOutlets是一个重要的内存管理问题。

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

1.不要真正学到任何东西,

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

一旦你了解了一切都是如何运作的,就用那些小帮手。

我在学习html、flex、swing和可可触觉时也经历过同样的经历.在开始的时候,它可能会花费更长的时间,但是一旦您理解了它,并且能够编写帮助类/方法,事情就会非常快速,并且对您有好处。

代码语言:javascript
复制
Just found some usefull information/tips about xib:

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

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

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

对于应用程序的主nib文件,只包括菜单栏(如果是iPhone应用程序,则只包括主窗口)。

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

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

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

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14808418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档