Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dlopen有没有办法在iOS上重新加载动态库文件?_Ios_Dylib_Dlopen - Fatal编程技术网

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?

查看for
dlclose
,似乎有几个原因导致库无法卸载

在一些情况下,动态库永远不会被使用 卸载:1)针对它的主要可执行链接,2)一个 不支持卸载(例如NSADIMAGE())用于加载它或某些 其他依赖于它的动态库,3)动态库是 在dyld的共享缓存中

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

sudo update_dyld_shared_cache -force
更换库后(但不确定iOS上是否提供此功能)


您是否检查了
dlclose
的返回值以查看它是成功的还是失败的?

update\u dyld\u shared\u cache
似乎在iOS中不可用(并且在Cydia中找不到)。您有过解决方案吗?