2010-10-29 34 views
2

我正在做一个iPhone插件项目,我在其中建立一个静态库,我们称之为lib1.a,我将其提供给其他程序员。如何有条件地仅在链接时使用静态库

当他们将lib1.a链接到他们的项目中时,他们也可以链接lib2.a,他们根据我给他们的头​​文件构建自己。这个头只包含一个“钩子”函数,它实例化一个obj-c对象。

这一切工作正常,但我想项目链接lib1.a不要必须链接lib2.a.请记住,iOS只支持静态库,我不想提供lib1.a的几个版本。

回答

3

谢谢,克里斯。我最后得到了类似的结果:可选的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,否则工厂类将被优化掉,因为没有编译时引用它。

0

如果您自己创建了挂钩寄存器,那么挂钩代码的存在会自行注册,缺少挂钩代码则不会。很明显,只有从lib1.a中调用已注册的钩子函数并且你很好去: -

你不需要做任何复杂的事情,只需使用c/C++/obj-c的基本特性就可以得到这个那种行为。

+0

感谢您的回复。通过这种方法,lib2.a中注册钩子的代码将如何执行? – Simplex 2010-10-29 12:26:43

+0

静态分配的C++类是一种方法。 – 2010-10-29 12:33:09

+0

谢谢,克里斯。这将工作。然而它变得有点混乱,因为lib2最好不知道或关心lib1。而且,lib2将在内部以obj-c为导向,因此,要求lib1的用户将C++代码添加到它们的lib中并不算太好。 – Simplex 2010-10-29 13:38:55

1

你不能在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代码,那么该类别应该使用该方法扩展该类。