我正在做一个iPhone插件项目,我在其中构建一个静态库,让我们称之为lib1.a,我将其提供给其他程序员。
当他们将lib1.a链接到他们的项目时,他们也可能链接lib2.a,他们根据我给他们的头文件自己构建。该头只包含一个“钩子”函数,它实例化一个obj-c对象。
这一切都运行正常,但我想将项目链接到lib1.a而不是必须链接lib2.a.请记住,iOS仅支持静态库,我不想提供多个版本的lib1.a。
答案 0 :(得分:3)
#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,否则工厂类将被优化掉,因为没有编译时引用它。
答案 1 :(得分:1)
在objective-C中,您不能使用静态库将类别(使用新方法)添加到现有的Objective-C类。
所以,如果lib1.a包含
@interface SomeObjectThatWantsToCallback
然后,lib2.a将包含
的定义@interface SomeObjectThatWantstoCallBack (CallbackImpl)
-(void)HookProc:{
}
现在,如果lib1.a中的SomeObjectThatWantsToCallBack中的代码需要调用HookProc,它可以执行
if( [self respondsToSelector: @selector( HookProc: )])
[self HookProc];
嗯,就像那样。假设已经添加了lib2.a代码,该类别应该使用该方法扩展该类。
答案 2 :(得分:0)
如果您自己创建了挂钩寄存器,那么挂钩代码的存在会自行注册,缺少挂钩代码。显然,只能从lib1.a调用已注册的钩子函数,你可以去: -
你不需要做任何复杂的事情,只需使用c / c ++ / obj-c的基本功能来获得这种行为。