dlopen 有没有办法在 iOS 上重新加载 dylib 文件?

Eam*_*ney 6 dylib dlopen ios

正如标题所说......我对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);
}
Run Code Online (Sandbox Code Playgroud)

这是取自这里

我遇到的问题是,如果我更改 mydylib2.dylib,dlopen则不会加载重新编译的 .dylib 文件。相反,它解析旧版本的函数someMethod

例如,如果someMethod第一次返回@"Hello"并且我将其更改为@"Hello World"并重新编译,则上面的代码将始终返回,@"Hello"直到我在模拟器中重新启动应用程序。

有谁知道为什么会这样?并建议一个解决方法,以便可以在运行时重新加载这个 .dylib?

mtt*_*trb 1

查看手册页,看起来dlclose有几个原因导致库无法卸载。

在几种情况下,动态库永远不会被卸载:1)主要可执行文件链接到它,2)使用不支持卸载的 API(例如 NSAddImage())来加载它或其他动态库这取决于它,3)动态库位于dyld的共享缓存中。

我怀疑你的问题是“dyld共享缓存”。你可以尝试运行:

sudo update_dyld_shared_cache -force
Run Code Online (Sandbox Code Playgroud)

替换库后(不确定这是否在 iOS 上可用)。

你有没有检查过返回值,dlclose看看它是成功还是失败?