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 loadNibNamed:xibName owner:[NSApplication sharedApplication]]加载Nib时如何传递参数?