[英]Is it possible to inherit from the main class in Objective-C (Xcode / iOS)?
[英]Xcode: Inherit `configuration`s from parent project - not possible?
是否可以從父項目繼承自定義配置? 不,不是要求繼承某些目標設置。
Xcode 中的每個項目都使用稱為Debug
和Release
的兩個標准配置進行初始化。 使用目標構建設置中顯示名稱Preprocessor Macros
下的設置(在.pbxproj
這稱為GCC_PREPROCESSOR_DEFINITIONS
)設置DEBUG
標志是一種非常常見的模式,可以從這樣的 Objective-C 代碼中讀取。
#ifdef DEBUG
print("DEBUG flag set")
#else
print("No debug flag!")
#endif
這也適用於 Swift,但是我們必須使用OTHER_SWIFT_FLAGS
並像這樣聲明它:
-D DEBUG
並像我們在上面的 Objective C 代碼中一樣讀取變量值。
我的應用程序由一個 xcworkspace 和一個主項目和幾個作為依賴項的項目組成。 讓我們稱我的應用程序依賴於框架的項目。 由於我有幾個框架,我不想多次設置構建設置。
因此我使用xcconfig
文件。 我有一個主配置,即主項目的配置文件,我們稱之為Main.xcconfig
。 我有另一個名為Framework.xcconfig
配置文件,它以#include "Main.xcconfig"
行#include "Main.xcconfig"
,因此繼承了Main
設置。 當然,我設置了每個框架以使用上述Framework.xcconfig
文件。
當我們有這些配置文件時,聲明DEBUG
標志非常方便,我們在Main.xcconfig
添加:
OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG
從而為主項目和框架項目的配置Debug
聲明DEBUG
標志(因為Framework.xcconfig
繼承自Main.xcconfig
...)。
如果我們希望能夠分析應用程序但設置了DEBUG
標志怎么辦? 分析應該使用與Release
相同的優化標志來完成。 但是我們絕對不想為Release
版本設置DEBUG
標志。
為什么不創建一個新配置,我們稱之為Profiling
。 問題來了! 當然,我們應該在主項目中創建這個新配置。 然后我們編輯我們的方案和Profile ,在Build Configuration 下我們選擇了新的配置Profiling
。
現在我們可以在Main.xcconfig
文件中為Profiling
設置DEBUG
標志。
OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG // we keep this
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG // we keep this
OTHER_SWIFT_FLAGS[config=Profiling] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Profiling] = DEBUG
我們嘗試運行模擬器,我們看到“沒有調試標志!” ,這是預期的,因為我們使用Debug
配置運行,因此不聲明DEBUG
標志。
所以我們嘗試分析並開始一些儀器測量並打開控制台。 在那里我們看到消息“DEBUG flag set”
它有效,太棒了!
我們剛剛檢查了 Main 項目中的DEBUG
標志。 如果我們在我們的一些框架中想要檢查我們的標志會發生什么。 所以我們在一些框架中嘗試#ifdef DEBUG
。 這是有效的,因為所有框架都有配置Debug
,因為它是所有項目的默認值(連同Release
)。
然后我們在我們的框架項目之一中嘗試#ifdef DEBUG
並再次開始使用 Instruments 進行分析。 現在我們看到消息“沒有調試標志!”
哦不! 它不工作! 為什么不呢?! 好吧,我不知道,但唯一合理的結論必須是我們作為依賴項添加的項目 - 我們的框架 -沒有從 Main 項目繼承Profiling
配置。
對我來說這是難以置信的......感覺就像是 Xcode 中的一個缺陷。
除了向所有框架項目添加相同的配置Profiling
之外,我不知道還有其他解決方案(至少對於我知道我想檢查該標志的框架)。 但這感覺就像一個丑陋的解決方案! . 我至少有 10 個框架,不得不為每個框架添加某種配置感覺真的很丑陋。
是的,當然另一種解決方案是使用Release
配置進行分析,並在Main.xcconfig
聲明DEBUG
標志,如下所示:
OTHER_SWIFT_FLAGS[config=Release] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = DEBUG
但是由於我們希望能夠檢查框架中的DEBUG
標志,因此我們需要將上面兩行聲明標志的行也添加到Frameworks.xcconfig
中。
當然,使用Release
配置進行分析作為該方案的構建配置。
然后我們可以向我們的 Main 項目添加一個名為AppStore
的新配置,並且只有 Main 項目並使用它來歸檔應用程序。 到目前為止還好嗎?
不,這不是一個好主意! 因為我剛才說了配置不是在項目和父項目之間繼承的。 因此我們的框架不會繼承這個新的AppStore
配置,所以當框架被構建/歸檔時,我看到它們“回退”到Release
配置(不確定你是否可以在某處選擇“默認”/“回退”配置?也許它會回退到您用作新配置基礎的那個?)。
但是由於我們剛剛為 Main 項目和所有框架的配置Release
添加了DEBUG
標志的聲明,並且當我們歸檔應用程序時,所有框架都使用Release
配置=>我們的生產應用程序將包含調試代碼! . 這是非常不受歡迎的和潛在的危險。
我不知道...你呢? 如果從父項目繼承配置不是很好嗎? 這樣就能解決一切! 蘋果……漂亮嗎?
解決方法:為每個項目和全局文件創建 xconfig 文件。 在項目 xconfig 文件中,通過
#include "path/to/File.xcconfig"
希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.