【发布时间】:2011-09-25 17:16:23
【问题描述】:
我想使用函数'dlopen()'调用iOS平台的动态库,函数'dlopen()'是私有API吗?
【问题讨论】:
-
嘿@Donald 你能接受我对这个问题的未来观察者的回答吗?
标签: ios dynamic-linking dlopen dynamic-library
我想使用函数'dlopen()'调用iOS平台的动态库,函数'dlopen()'是私有API吗?
【问题讨论】:
标签: ios dynamic-linking dlopen dynamic-library
多年来,我在 iOS 上使用 dlopen 取得了成功。在我的用例中,我使用 dlopen 按需加载公共系统框架,而不是在应用启动时加载它们。效果很好!
[编辑] - 从 iOS 8 开始,扩展和共享框架被禁止使用 dlopen,但是应用程序本身仍然可以使用 dlopen(现在记录为不仅支持 Apple 框架,还支持自定义框架)。请参阅此 Apple 文档中的将包含的应用程序部署到旧版本的 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]);
}
}
【讨论】:
void* handle = dlopen("/System/Library/Frameworks/UIKit.framework/UIKit", RTLD_NOW); 然后您可以通过调用dlclose(handle); 卸载(将加载计数减1)。请务必阅读文档以获取更多信息。 developer.apple.com/library/mac/documentation/Darwin/Reference/…