簡體   English   中英

靜態庫iOS中的鏈接弱

[英]Weak linking in static library iOS

我們已經建立了一個靜態框架,它依賴於我們用來訪問ID的SDK。 該SDK已發布了具有新界面的新版本。

當前,用戶將添加我們的框架和依賴項SDK,並且一切正常。 現在,我們希望用戶能夠添加我們的框架以及舊的或新的SDK,並且我不確定如何在不創建多個我們不希望這樣做的目標的情況下執行此操作。 使用我設置的方式,用戶必須添加我們的SDK以及舊的和新的SDK。

我有一個協議SDKProtocol ,它由兩個類NewSDKServicesOldSDKServices

NewSDKServices將無法編譯,除非新的SDK存在並且OldSDKServices將無法編譯,除非老的SDK是存在的。 我認為這是可以的,因為它是一個預編譯的框架,我們可以在運行時決定使用哪個框架。

然后,我希望能夠執行類似的操作,也許可以使用ifdef導入並初始化正確的服務。

if (useNewSDK) {
    _sdkService = [[NewSDKServices alloc] init];
} else {
    _sdkService = [[OldSDKServices alloc] init];
}

我曾考慮過弱鏈接這些庫,但由於不能將靜態鏈接框架靜態鏈接到其他靜態框架,因此無法完全確定它的工作方式。 我希望有方向。

這兩個SDK都有一些標頭和.a

我知道您說過您不想要兩個目標。 坦白地說,這可能是最好的選擇,因為您對要求很明確並且很先行,因此沒有人會很容易混淆。 有很多方法可以通過重新使用源文件甚至使用您建議的方式來管理此問題

if (useNewSDK) {
    _sdkService = [[NewSDKServices alloc] init];
} else {
    _sdkService = [[OldSDKServices alloc] init];
}

將會

#ifdef USE_SDK_NEW
    _sdkService = [[LinkedSDK alloc] init];
#else //USE_SDK_NEW
    _sdkService = [[LinkedSDK alloc] init];
#endif //USE_SDK_NEW 

但是...如果您真的想以其他方式做到這一點並且可以解決問題,則必須嘗試使用​​弱鏈接。

如果使用弱鏈接,則通常需要NSClassFromString(...)來訪問內容。 您將需要確定SDK的可用性,希望有人將信息添加到了[NSClassFromString("TheSdk") performSelector: @"GetVersion"]類的靜態類中,或者利用了其他類是否存在的知識。 如果兩個版本之間的類集相同,則您將退回到查詢選擇器或成員。

再次,這將不是很漂亮。 如果熟悉並且對舊的SDK和新的SDK有策略,則可以使用策略模式來使其變得不那么難看,並嘗試弱鏈接這些類而不會導致編譯器要求它們。

如果您將自己作為Pod進行分發,則可以創建兩個目標,並使用該版本來區分所需的其他SDK。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM