您可以使用操作的核心基础函数来获取对导出给定CFBundle
函数名称的包的包引用:
CFStringRef functionName = CFSTR("someFunctionName");
CFArrayRef allBundles = CFBundleGetAllBundles();
CFIndex i;
CFIndex bundleCount = CFArrayGetCount(allBundles);
for (i = 0; i < bundleCount; i++) {
CFBundleRef bundle = CFArrayGetValueAtIndex(allBundles, i);
void *functionPointer = CFBundleGetFunctionPointerForName(bundle, functionName);
if (functionPointer != NULL) {
// bundle points to a bundle that exports functionName
}
}
并且由于CFBundleGetDataPointerForName()
返回一个指向包中给定符号名称的数据指针,我相信它也可以用于类名称,因为一个类是用符号名称导出的_OBJC_CLASS_$_<className>
,例如_OBJC_CLASS_$_NSArray
.
据我所知,没有任何函数可以让您通过指定函数地址来检查包是否导出函数。