函数'dlopen()'是私有API吗?

Don*_*ald 21 dynamic-linking dlopen dynamic-library ios

我想使用函数'dlopen()'在iOS平台上调用动态库,是函数'dlopen()'私有API?

NSP*_*mer 22

多年来我在iOS上使用dlopen取得了成功.在我的用例中,我使用dlopen按需加载公共系统框架,而不是在应用程序启动时加载它们.效果很好!

[编辑] - 从iOS 8开始,禁止使用扩展和共享框架dlopen,但是应用程序本身仍然可以使用dlopen(现在记录为不仅支持Apple框架,还支持自定义框架).请参阅此Apple doc中的" 将包含应用程序部署到iOS的旧版本"部分:https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf

[编辑] - 人为的例子

#import <dlfcn.h>

void printApplicationState()
{
    Class UIApplicationClass = NSClassFromString(@"UIApplication");
    if (Nil == UIApplicationClass) {
        void *handle = dlopen("System/Library/Frameworks/UIKit.framework/UIKit", RTLD_NOW);
        if (handle) {
            UIApplicationClass = NSClassFromString(@"UIApplication");
            assert(UIApplicationClass != Nil);
            NSInteger applicationState = [UIApplicationClass applicationState];
            printf("app state: %ti\n", applicationState);
            if (0 != dlclose(handle)) {
                printf("dlclose failed! %s\n", dlerror());
            }
        } else {
            printf("dlopen failed! %s\n", dlerror());
        }
    } else {
        printf("app state: %ti\n", [UIApplicationClass applicationState]);
    }
}
Run Code Online (Sandbox Code Playgroud)