2010-10-29 78 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代碼,那麼該類別應該使用該方法擴展該類。