【发布时间】:2011-04-13 04:30:48
【问题描述】:
Interface Builder 文件中的 nib 和 xib 有什么区别?
【问题讨论】:
-
想知道 xib 是什么时候引入的?我也是!可能在 2007 年 10 月到 2008 年 7 月之间,因为它是在 XCode 3.1 之间引入的。 source for XCode version, source for XCode version date
Interface Builder 文件中的 nib 和 xib 有什么区别?
【问题讨论】:
从 Interface Builder 版本 3 开始,添加了一种新的文件格式(扩展名为 .xib),其功能与 .nib 相同,不同之处在于它存储在平面文件中,使其更适合存储在修订控制中通过 diff 等工具进行系统和处理。
【讨论】:
从功能上讲,xib 是一种源代码控制友好格式
【讨论】:
此外,当您编译项目时,.xib 文件将被编译到 nib 中。
【讨论】:
XIB 是平面文件,而不是捆绑包。这使得 SCM(源代码控制管理)系统更容易处理。当您编译您的应用程序时,XIB 会被编译成一个 NIB 文件以包含在您的应用程序中。
应用程序包中包含的已编译 NIB 不再可在 Interface Builder 中编辑,并且比等效的 XIB 或旧版 NIB 文件小得多。
【讨论】:
XIB文件基本上是NIB文件的源文档,XIB几乎总是可以在Xcode中编辑(除非它们已过时或损坏)。虽然较新的 NIB 已压缩且无法打开,但较旧的 NIB 是可以通过 Xcode 查看的捆绑包,捆绑的 NIB 包含一些源/存档文件,其中包括 designable.nib,通常只是重命名的 XIB 文件。
NIB = Nxt I接口Buider (NXT = NextStep = NS)
XIB = Xml I接口Buider
尽管新归档的 NIB 文件无法对包括 Xcode 在内的大多数应用程序打开,但它们仍可能被取消归档。我在CharlesSoft 网站上发现了这个名为 NibUnlocker 的免费软件应用程序,它可以分解一个扁平的 Nib 文件并将其导出为 XIB 文件。此应用程序仍然存在相当多的错误,但根据 Nib 的内容,它有时非常准确。
(NibUnlocker 是一个非常不准确的名称,Nib 未锁定它们已存档)
如果您想了解更多信息,可以阅读我在下面提供的关于 NIB 和 XIB 格式的一些附加信息:
Nxt 界面生成器剖析:
扁平NIBs
Flat NIB 文件是分析起来很复杂的文件,但这并非不可能。这些文件的结构只是一个苹果二进制属性列表(以“bplist00”开头),其中一些内容是通过 NSKeyedArchiver 存档的。由于 NIB 被格式化为属性列表,这允许一个小技巧:如果您实际上将扁平 Nib 的扩展名更改为 .plist,例如。
ArchivedNib.nib到ArchivedNib.plist实际上,您将能够在 Xcode 中将其作为属性列表查看,尽管不会显示所有值,因为 Xcode 不知道如何显示某些值(CFKeyedArchiverUID 值)。当您将 Nib 视为属性列表时,您可能会得到一些基本属性,例如 $version、$objects、$archiver 和 $top。实用说明
CFKeyedArchiverUID 对象只是一个重定向器,在 {value = xx} 中,值是 $objects 数组中项目的 index(从一开始的数组)。例如。
<CFKeyedArchiverUID 0x60800002bc20 [0x7fffef6b8c30]>{value = 29},value = 29,结果将是 $object 数组中的第 29 项(请记住数组以 0 开头)。在 Objective C 中,您可以使用此方法从 CFKeyedArchiverUID 中检索此值:
+ (NSUInteger)valueForKeyedArchiverUID:(id)keyedArchiverUID {
void *uid = (__bridge void*)keyedArchiverUID;
NSUInteger *valuePtr = uid+16;
return *valuePtr;}
(我自己在互联网上发现了这一点,后来我使用Hopper 来反汇编NibUnlocker,我注意到在它的源代码中,它通过将 NIB 加载到NSDictionary 并遍历它的所有连接、对象等。并写出一个新的XIB)
如果这有帮助,请给我点个赞 ;-)
【讨论】: