Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.xib文件提供iPhone应用程序';什么是GUI?_Iphone_Objective C_Performance_Nib_Xib - Fatal编程技术网

使用.xib文件提供iPhone应用程序';什么是GUI?

使用.xib文件提供iPhone应用程序';什么是GUI?,iphone,objective-c,performance,nib,xib,Iphone,Objective C,Performance,Nib,Xib,我想知道在GUI设计中使用.xib文件和以编程方式这样做之间是否有区别 由于它是一个编译器,我会假设没有相关的时间损失 我错了吗?很少。也有一些例外。例如,如果使用xib将图像加载到UITableViewCell中,则这可能是一个问题,因为具有许多单元格的UITableViews对加载时间非常敏感。但是,无论出于何种目的,都不应该有明显的性能影响 xib中的信息确实必须在运行时解码并加载到内存中,这比直接以编程方式创建UI元素要慢。小心过早的优化,尤其是当它涉及到编写比需要多得多的代码时 (注意

我想知道在GUI设计中使用.xib文件和以编程方式这样做之间是否有区别

由于它是一个编译器,我会假设没有相关的时间损失


我错了吗?

很少。也有一些例外。例如,如果使用xib将图像加载到UITableViewCell中,则这可能是一个问题,因为具有许多单元格的UITableViews对加载时间非常敏感。但是,无论出于何种目的,都不应该有明显的性能影响


xib中的信息确实必须在运行时解码并加载到内存中,这比直接以编程方式创建UI元素要慢。

小心过早的优化,尤其是当它涉及到编写比需要多得多的代码时

(注意:在我的手机上点击这个,所以我为任何奇怪的格式或语法提前道歉-如果有问题,我会在回到笔记本电脑前解决。)

我自己做了一些快速、肮脏、非常非正式的测试来验证这一点,以下是我的发现(请注意,我为测试构建的应用程序只是一个划痕,不一定代表“真实”的应用程序):

  • 当初始屏幕为nib时,启动时间更快

  • 对于所有后续屏幕,手动编写UI时,性能会提高

一开始这很奇怪,但是当你想起来的时候,也许它并没有那么奇怪

启动问题让我困惑,但我认为这是因为苹果,作为一个苹果,沉迷于启动时间(当然,这是一个很好的方式),刚刚优化了手机的无存档,从存档(nib)加载比手工编码更快

也就是说,大多数人编写的应用程序不会受到任何差异的显著影响。我的(同样是:快速和肮脏)测试表明,从冷启动开始(你还没有运行应用程序,或者已经有一段时间了),基于nib的应用程序始终以大约两倍于手工编码版本的速度加载其初始屏幕。虽然这听起来很重要,但我们只讨论了几毫秒。用户将无法察觉这种差异。对于热启动(您已经打开和关闭了应用程序),启动时间的差异要小得多

由于这个原因,我喜欢使用NIB来为应用程序奠定基础:任何顶级导航(选项卡控制器、导航控制器等),然后用手对其余的UI进行编码。

另外,由于iPhone的用户界面是如此特别,那么,iPhone(令人惊讶!),手工编写用户界面并不像编写桌面应用程序那样困难。你一遍又一遍地使用相同的UI组件——一旦你搞定了,在代码中快速创建UI就很容易了。您没有80亿个小部件可供选择,就像您开发Windows/OS X/任何应用程序一样。iPhone的一致性使它成为我多年来开发的手工编写UI的最简单平台

我还发现,当我手工编写UI时,NSCoding(我用于在应用程序运行期间保持状态)更容易使用。我遇到了一些问题,基于nib的屏幕由于UIImage实例而无法正确存档。UIImage(至少在我上次检查时)不符合NSCoding,因此归档过程将终止(这是一个相当令人不快的终止)。我在这里以UIImage为例,但是归档程序试图存储的任何不符合NSCoding的内容都会破坏这个过程,所以这是需要考虑的

还有一次,每当我使用动态表时,我总是手工编写UI。如果我要创建一个静态表,它的单元格基本上永远不会改变,那么NIB就可以了。对于任何其他类型的表,尤其是那些具有缩略图和其他资源密集型位的表,我在手动编码时获得的控制使您能够获得基于nib的表单元无法获得的性能。为此,您确实需要跳过CoCoatTouch并直接使用CoreGraphics,但您所能做的性能改进值得您编写的每一行代码。有关我参与过的项目的表格性能示例,请参阅Barnes and Noble商店(不是电子书阅读器)和Style.com。我们为这些(和其他)应用程序构建了一个框架,平滑表格滚动的秘密在于我们从未使用过从NIB加载的单元格(比这更复杂,但跳过NIB是获得这些应用程序性能的第一步)

一般来说,使用NIB时可能要考虑的最重要的事情是,需要通过文件打破UI。也就是说,不要把你的应用程序的整个用户界面粘在一个笔尖上。当一个nib被加载时,这就是全部——在nib中可能会有一个视图,你的用户很少看到,如果有的话,这些视图会像其他任何东西一样被加载,毫无理由地占用资源。如果你不为每个应用程序的屏幕使用单独的笔尖,很容易出现内存和性能问题

为了进一步澄清:如果你有一个有五个视图控制器的应用程序,请将每个控制器粘在自己的nib中。在需要之前,您不想加载任何内容。这也有例外,但这只是编码的方式——如果有足够的时间,你会找到“错误的方式”做某事的理由,但是a-nib-for-each-screen方法是你应该做的方式,除非你有充分的理由不这样做

我会把它放在那里的——我希望它能帮上一点忙

记住:

  • 我非正式的闲逛表明,用笔尖创业更快(只要你让笔尖尽可能简单,只保留你需要的东西)

  • 启动后,手动编码UI的性能似乎有所提高

  • 如果操作正确,如果您没有编写游戏或