我正在開發一個包含Mac應用程序和共享代碼的iPad應用程序的項目。如何使用條件編譯開關從iPhone項目中排除Mac特定的代碼,反之亦然?我注意到TARGET_OS_IPHONE
和TARGET_OS_MAC
都是1,所以它們都是真的。是否有另一個可以使用的開關,只有在編譯特定目標時纔會返回true。哪種條件編譯用於在Mac和iPhone之間切換特定的代碼?
大部分情況下,我通過將#include <UIKit/UIKit.h>
和#include <Cocoa/Cocoa.h>
移動到兩個項目的預編譯頭文件中來獲得合作文件。我共享模型和一些實用程序代碼,可從RSS提要和Evernote獲取數據。
特別是,[NSData dataWithContentsOfURL:options:error:]
函數對於選項參數iOS 3.2和更早版本以及Mac OS 10.5和更早版本,採用了不同於常規的iOS 4和Mac OS 10.6。我使用的條件是:
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_3_2)) || (TARGET_OS_MAC && (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5))
這似乎是工作,但我要確保這是防彈的。我的理解是,如果Mac版本設置爲10.6,但iOS版本設置爲3.2,即使它正在爲iOS 3.2編譯,它仍會使用新的常量,這看起來不正確。
在此先感謝您的幫助!
不幸的是,如果你有iOS和OSX的項目,TARGET_OS_IPHONE似乎在任何情況下都被定義。 – 2013-12-05 20:37:36
是的。它被定義爲OSX爲1,iOS爲1。您需要使用'#if TARGET_OS_IPHONE',而不是'#ifdef TARGET_OS_IPHONE'。增加了一個例子。 – 2013-12-06 05:43:56
順便說一句,該圖表來自蘋果公司的「運行時間爭吵者」。如果現實似乎與他不同意,那就問現實吧。 :) – 2013-12-06 05:51:11