XIB文件基本上是一个NIB文件的源文档,XIB文件通常可以在Xcode中进行编辑(除非它们已过时或损坏)。而新版的NIB文件是压缩的,无法打开,旧版的NIB文件是包文件,可以在Xcode中查看。打包的NIB文件包含一些源/存档文件,其中包括designable.nib
,通常只是重命名的XIB文件。
虽然包含新型档案格式的NIB文件无法在大多数应用程序(包括Xcode)中打开,但它们仍有可能被解压缩。我发现了一个叫做NibUnlocker 的免费软件,在CharlesSoft网站上可以把扁平的Nib文件拆分并导出为XIB文档。尽管该应用程序存在相当多的缺陷,但有时候根据Nib的内容,表现得还是非常准确的。
(NibUnlocker这个名字其实不太准确,Nibs并没有被锁住,而是被归档)
平面NIB
一个平面NIB文件是一个复杂的文件,但这并不是不可能分析。这些文件的结构只是苹果二进制属性列表(以“bplist00”开头),其中一些内容通过NSKeyedArchiver进行存档。由于一个NIB被格式化为属性列表,这允许小小的黑客:如果你实际上改变了一个平面Nib的扩展名为.plist,例如ArchivedNib.nib
改为ArchivedNib.plist
,你将能够在Xcode中打开它,并将其视为属性列表,尽管并不是所有的值都会显示,因为Xcode不知道如何显示一些值(CFKeyedArchiverUID值)。当您将一个NIB视为属性列表时,您可能会得到一些基本属性,如$version、$objects、$archiver和$top。
有用的注释
CFKeyedArchiverUID对象只是一个重定向器,在{value = xx}中,该值是$objects数组中的一个项目的索引(从数组的开头开始)。例如,<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;}
XIB是平面文件,而不是捆绑文件。这使得SCM(源代码管理)系统更容易处理。当您编译应用程序时,XIB会被编译成NIB文件以包含在您的应用程序中。
包含在应用程序捆绑中的已编译NIB文件在Interface Builder中不再可编辑,并且比相应的XIB或旧版NIB文件要小得多。
同时,当您编译项目时,.xib文件将会被编译成nib文件。
从功能上来说,xib只是一种友好的源代码控制格式。