我正在做一个 iPhone 插件项目,我在其中构建了一个静态库,我们称之为 lib1.a,我将其提供给其他程序员。
当他们将 lib1.a 链接到他们的项目中时,他们也可能会链接 lib2.a,这是他们根据我给他们的头文件自行构建的。该 header 仅包含一个实例化 obj-c 对象的“hook”函数。
这一切都工作正常,但我希望链接 lib1.a 的项目不必必须链接 lib2.a。请记住,iOS 仅支持静态库,我不想提供 lib1.a 的多个版本。
最佳答案
谢谢,克里斯。我最终得到了类似的结果:可选的 lib2.a 包含一个工厂类,它创建一个实现特定协议(protocol)的对象,该协议(protocol)公开可选功能。这是标题:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol OptionalStuffDelegate
// Delegate methods here
@end
@protocol OptionalStuff
// Methods here
@end
@interface OptionalStuffFactory : NSObject {}
+ (id<OptionalStuff>)instantiateWithDelegate:(id <OptionalStuffDelegate>)delegate baseView:(UIView *)baseView;
@end
要在 lib1.a 中实例化,我这样做:
Class optionalStuffFactoryClass = NSClassFromString(@"OptionalStuffFactory");
if (optionalStuffFactoryClass != nil)
{
optionalStuff = [optionalStuffFactoryClass performSelector: @selector(instantiateWithDelegate:baseView:) withObject: self withObject: glView];
}
lib2.a 实现工厂类。事实上,没有任何对OptionalStuffFactory类的编译时引用,可以确保在缺少lib2.a的情况下不会出现 Unresolved 问题。
重要提示:您必须确保包含库的构建目标使用链接器标志 -ObjC,否则工厂类将被优化掉,因为没有对其进行编译时引用。
关于xcode - 如何仅在链接时有条件地使用静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051453/