2012-09-29 78 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

相關問題