我正在做一個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