我正在做一个iPhone插件项目,我在其中建立一个静态库,我们称之为lib1.a,我将其提供给其他程序员。如何有条件地仅在链接时使用静态库
当他们将lib1.a链接到他们的项目中时,他们也可以链接lib2.a,他们根据我给他们的头文件构建自己。这个头只包含一个“钩子”函数,它实例化一个obj-c对象。
这一切工作正常,但我想项目链接lib1.a不要必须链接lib2.a.请记住,iOS只支持静态库,我不想提供lib1.a的几个版本。
我正在做一个iPhone插件项目,我在其中建立一个静态库,我们称之为lib1.a,我将其提供给其他程序员。如何有条件地仅在链接时使用静态库
当他们将lib1.a链接到他们的项目中时,他们也可以链接lib2.a,他们根据我给他们的头文件构建自己。这个头只包含一个“钩子”函数,它实例化一个obj-c对象。
这一切工作正常,但我想项目链接lib1.a不要必须链接lib2.a.请记住,iOS只支持静态库,我不想提供lib1.a的几个版本。
谢谢,克里斯。我最后得到了类似的结果:可选的lib2.a包含一个工厂类,该工厂类创建一个实现特定协议的对象,该协议公开可选功能。这是标题:
#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,确保没有未解决的问题。
重要提示:您必须确保包含库的构建目标使用链接器标志-ObjC,否则工厂类将被优化掉,因为没有编译时引用它。
如果您自己创建了挂钩寄存器,那么挂钩代码的存在会自行注册,缺少挂钩代码则不会。很明显,只有从lib1.a中调用已注册的钩子函数并且你很好去: -
你不需要做任何复杂的事情,只需使用c/C++/obj-c的基本特性就可以得到这个那种行为。
你不能在Objective-C中使用静态库向现有的Objective-C类添加一个带有新方法的类别。
所以,如果包含了lib1.a
@interface SomeObjectThatWantsToCallback
然后,lib2.a将包含的
@interface SomeObjectThatWantstoCallBack (CallbackImpl)
-(void)HookProc:{
}
的定义现在,如果代码SomeObjectThatWantsToCallBack在了lib1.a需要调用HOOKPROC它可以做
if([self respondsToSelector: @selector(HookProc:)])
[self HookProc];
好吧,类似的东西。假设已经添加了lib2.a代码,那么该类别应该使用该方法扩展该类。
感谢您的回复。通过这种方法,lib2.a中注册钩子的代码将如何执行? – Simplex 2010-10-29 12:26:43
静态分配的C++类是一种方法。 – 2010-10-29 12:33:09
谢谢,克里斯。这将工作。然而它变得有点混乱,因为lib2最好不知道或关心lib1。而且,lib2将在内部以obj-c为导向,因此,要求lib1的用户将C++代码添加到它们的lib中并不算太好。 – Simplex 2010-10-29 13:38:55