iOS故事板/ NIBs低级解剖.他们如何实施?

我对iOS中的NIB / Storyboards机制的低级细节感兴趣.我想更多地了解他们的意图 – 我有兴趣开发自己的机制.我在苹果网站上找到了有关 NIB files的一些信息.

他们说:一个nib文件与Xcode中的配置完全相同.在运行时,这些描述用于在应用程序内重新创建对象及其配置.但是我找不到任何有关Storyboard如何实现的信息.故事板只是一堆(包)的NIB文件 – 每个UIViewController一个?还是使用不同的机制?而NIB / Storyboard的XML源呢?有没有一些基础翻译从XML到Objective-C源代码?低级细节将不胜感激.

解决方法

故事板和XIB文件被编译成二进制格式的NIB文件.这些文件是部署应用程序时可以在bundle中找到的.

NIB文件更容易理解.它们包含对象层次结构的数组.故事板更复杂,因为它们包含整个场景,所以有更多的元数据(包括哪个视图控制器是场景中的初始等等). Segues也是可解码的对象.

在NIB文件和故事板中定义的每个对象都有一个唯一的密钥(例如vXZ-lx-hvc,当编译时,附加了类的名称,所以最终是LNViewController-vXZ-lx-hvc).

当您尝试加载在NIB或故事板(通常是视图,视图控制器和段)中定义的对象时,还可以在Interface Builder中定义其他对象,创建一个类型为UINibDecoder的解码器,该解码器负责在二进制NIB文件并将其解码为活动对象.然后分配一个对象并调用initWithCoder:传递解码器.然后,对象为其支持的每个属性调用各种解码方法.例如,表视图将解码其风格,其背景视图,单元格高度,委托等.解码完成后,NIB加载程序调用awakeFromNib来通知从NIB加载的对象.

故事板被编译成多个NIB文件,通常是每个视图控制器的NIB文件.当从故事板加载对象时,内部UIStoryboard具有要为特定视图控制器加载的NIB文件的元数据.当视图控制器被解码时(在它的initWithCoder :,它加载其整个视图层次结构,属性值,附加对象等)

最后,每个NIB文件(以及扩展,故事板)都能够包括在对象被成功解码之后应用的键值信息.

要实现自己的类似系统,您需要提供一个类似的系统,可以推导出类型,分配对象,然后用自己的解码器初始化它.由于视图和视图控制器实现了NSCoding协议,因此您可以轻松调查他们支持的密钥,并创建解码器和数据格式以支持相同的密钥.

如果您希望遵循NIB和故事板加载流程,我建议您查看类转储,为关键方法设置断点并检查传递的参数到方法调用.在64位模拟器上进行调试时,汇编输出非常容易阅读,您可以使用po $arg1轻松检查传递的参数,为自对象使用调用方法选择器po $arg3的po NsstringFromSelector($arg2). ..以下参数.

建议的方法开始:

-[UIStoryboard instantiateViewControllerWithIdentifier:]
-[UIStoryboard instantiateInitialViewController]
-[UIStoryboard nibForViewControllerWithIdentifier:]
-[UINibDecoder decodeObjectForKey:]

(和其他-decode *** ForKey:方法)

设置一个符号断点,并查看传递的程序集和参数.

使用状态恢复时会发生非常类似的过程.不同的是,视图被提供了一个编码器,并且将它们的属性编码成该编码器;在恢复期间,从状态恢复解码器恢复视图.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...