7

タイトルの通り…興味があり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"

なぜこれが当てはまるのか知っていますか?この.dylibを実行時に再ロードできるように、回避策を提案しますか?

4

1 に答える 1

1

Looking at the man page for dlclose it looks like there are a couple of reasons why the library wouldn't be unloaded.

There are a couple of cases in which a dynamic library will never be unloaded: 1) the main executable links against it, 2) An API that does not supoort unloading (e.g. NSAddImage()) was used to load it or some other dynamic library that depends on it, 3) the dynamic library is in dyld's shared cache.

I suspect your issue is the "dyld shared cache." You could try running:

sudo update_dyld_shared_cache -force

after you've replaced the library (not sure if this is available on the iOS though).

Have you checked the return value of dlclose to see if it was successful or failed?

于 2012-09-29T14:03:34.510 に答える