RLT*_*RLT 9 c macos cocoa objective-c dylib
我有一个动态库,我加载使用dlopen()然后卸载使用dlclose();
如果我不包含任何目标c代码dlopen()需要一个dlclose()预期行为的调用.但是当我将任何目标c代码包含在目标中时,我遇到的问题是我需要对dlclose()加载的库进行两次调用才能卸载.
这是预期的行为吗?我该如何解决?
rob*_*off 31
我意识到你在使用dlopen,而不是CFBundle或NSBundle.尽管如此,Code Loading Programming Topics手册说明了这一点:
在Cocoa应用程序中,您不应该使用
CFBundle例程来加载和卸载可执行代码,因为CFBundle它本身不支持Objective-C运行时.NSBundle将Objective-C符号正确加载到运行时系统中,但由于运行时限制,无法在加载后卸载Cocoa包.
还有这个:
由于Objective-C运行时系统的限制,
NSBundle无法卸载可执行代码.
这让我怀疑当你加载你的库时,它会将自己注册到Objective-C运行时,并且运行时dlopen再次调用库(或以某种方式增加库的引用计数).
我搜索了Objective-C运行时源代码,发现了这个:
// dylibs are not allowed to unload
// ...except those with image_info and nothing else (5359412)
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) {
dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD);
}
Run Code Online (Sandbox Code Playgroud)
所以,是的,Objective-C运行时dlopen专门调用您的库以防止它被卸载.如果你作弊并打电话dlclose两次,你应该期待发生不好的事情.
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |