2012-09-29 41 views
3

正如标题所说......我对dlopen()感兴趣。我明白这是应用商店不允许的,但我对iOS的这一点很好奇。有没有办法让dlopen重新加载iOS上的dylib文件?

我的问题是,我可以创建一个名为.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); 
} 

这是从here采取加载此文件。

我遇到的问题是,如果我更改mydylib2.dylib,dlopen不会加载重新编译的.dylib文件。而是解决旧版本的功能someMethod

例如,如果someMethod第一回报@"Hello",我改变这是@"Hello World"并重新编译,上面的代码将总是返回@"Hello",直到我重新启动在模拟器中的应用程序。

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

+0

你有没有得到这个解决方案? – newenglander

回答

0

man page对于dlclose它看起来像有几个原因为什么图书馆不会被卸载。

有几个箱子,其中动态库将永远不会被 卸载:1)针对它的主可执行文件的链接,2),它 不supoort卸载的API(例如NSAddImage())被用来加载它或其他一些动态库,依赖它,3)在dyld的共享缓存中的动态库是 。

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

sudo update_dyld_shared_cache -force 

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

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

+0

'update_dyld_shared_cache'在iOS中似乎不是很容易获得(并且无法在Cydia中找到它)。 – newenglander

相关问题