dlopen有没有办法在iOS上重新加载动态库文件?
正如标题所说。。。我对dlopen有没有办法在iOS上重新加载动态库文件?,ios,dylib,dlopen,Ios,Dylib,Dlopen,正如标题所说。。。我对dlopen()感兴趣。我知道这是应用商店不允许的,但我对iOS上的这一点很好奇 我遇到的问题是,我可以创建一个.dylib文件,并且可以在运行时使用以下代码加载该文件 char *dylibPath = "/Applications/myapp.app/mydylib2.dylib"; void *libHandle = dlopen(dylibPath, RTLD_NOW); if (libHandle != NULL) { NSString * (*some
dlopen()
感兴趣。我知道这是应用商店不允许的,但我对iOS上的这一点很好奇
我遇到的问题是,我可以创建一个.dylib文件,并且可以在运行时使用以下代码加载该文件
char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";
void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
NSString * (*someMethod)() = dlsym(libHandle, "someMethod");
if (someMethod != NULL) {
NSLog(someMethod());
}
dlclose(libHandle);
}
这是从一本书中摘取的
我的问题是,如果我更改mydylib2.dylib,dlopen
不会加载重新编译的.dylib文件。相反,它解析函数someMethod
的旧版本
例如,如果someMethod
首先返回@“Hello”
,我将其更改为@“Hello World”
并重新编译,则上述代码将始终返回@“Hello”
,直到我在模拟器中重新启动应用程序
你知道为什么会这样吗?并建议一种解决方法,以便在运行时重新加载this.dylib?查看fordlclose
,似乎有几个原因导致库无法卸载
在一些情况下,动态库永远不会被使用
卸载:1)针对它的主要可执行链接,2)一个
不支持卸载(例如NSADIMAGE())用于加载它或某些
其他依赖于它的动态库,3)动态库是
在dyld的共享缓存中
我怀疑您的问题是“dyld共享缓存”。您可以尝试运行:
sudo update_dyld_shared_cache -force
更换库后(但不确定iOS上是否提供此功能)
您是否检查了
dlclose
的返回值以查看它是成功的还是失败的?update\u dyld\u shared\u cache
似乎在iOS中不可用(并且在Cydia中找不到)。您有过解决方案吗?