NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?

Posted

技术标签:

【中文标题】NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?【英文标题】:How does the NSBundle's -load method register classes and other runtime resources with the Objective-C runtime? 【发布时间】:2013-01-03 23:25:12 【问题描述】:

Foundation 的 NSBundle 是在 Objective-C 中加载动态代码的最佳方式。 -load 方法将包的可执行代码动态加载到正在运行的程序中。

但是,NSBundle 的-load 方法使用哪个Objective-C 运行时公共函数来加载动态库并使用Objective-C 运行时注册类、类别、协议、方法、选择器等?声明在哪个头文件中?

【问题讨论】:

在哪个标头中声明了 what?您是否只是在询问运行时函数列表:developer.apple.com/library/mac/#documentation/Cocoa/Reference/…?或者您想了解 NSBundle 所经历的具体过程的详细信息吗? 我要求-load 方法使用的运行时函数列表中的函数将包的类、方法、选择器和其他资源注册到obj-c 运行时。因为这些功能似乎都没有这样做。 【参考方案1】:

NSBundle 不为此使用 ObjC 运行时。它使用 dlopen,动态链接器处理加载内容。

【讨论】:

NSBundle 肯定使用 dlopen,但运行时系统必须跟踪加载的类。因此,如果文件仅包含已编译的 C 函数,例如,dlopen 就足够了。但如果它包含 Objective-C 类声明,则需要在 objc-runtime 中注册它们。这是怎么做到的? map_images_nolock,在opensource.apple.com/source/objc4/objc4-532.2/runtime/…,没有用于此的公共 API (要清楚:dyld 调用到使用该函数的 objc 运行时) 现在你在说话!这就是我不想知道的。因此,没有公共函数,Cocoa 必须使用一些私有的 Objective-C 运行时标头(更具体地说是opensource.apple.com/source/objc4/objc4-532.2/runtime/…,它声明了map_images)或在外部引用map_images。非常感谢! Cocoa 不使用这个。 Cocoa 调用 dlopen(),而 that 使用 map_images。

以上是关于NSBundle 的 -load 方法如何向 Objective-C 运行时注册类和其他运行时资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何卸载 NSBundle?

使用方法[NSBundle loadNibNamed:xibName owner:[NSApplication sharedApplication]]加载Nib时如何传递参数?

如何创建具有文件类型的资源包? NSBundle?

在为自定义视图调用 NSBundle(使用 loadNibName)后访问 IBOutlets 的最佳方法

NSBundle 中的类

无法在 iphone 单元测试中从 NSBundle 加载文件