Availability.h
/*
* Copyright (c) 2007-2009 by Apple Inc.. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* 這個文件包含源碼或者在對於原代碼修改的定義,適用於蘋果共有資源許可第2.0版。
* 你在使用此文件時必須遵守協議,請在http://www.opensource.apple.com/apsl/
* 獲取協議的拷貝,在使用本文件之前閱讀它。
*
* 源代碼和所有的軟件在協議下的發佈時遵守""的AS IS"的原則的:沒有任何的警告,不包含任何的明示或者暗示,
* 同時Apple特此聲明這一類的保證,包括不對出售的做任何的限制和保證。
* 對於特定的用途,是不受干擾和侵權的。
* 請在當前的協議下閱讀特定語言賦予的權力和限制
*
* @APPLE_LICENSE_HEADER_END@
*/
#ifndef __AVAILABILITY__
#define __AVAILABILITY__
/*
這些宏都是用在頭文件種。它們是作用於和系統版本有關的函數聲明或者函數,如果它們是可用的就標示它們首次有效的方法;或者被拋棄的函數。
MAC OS 和IOS 有不同的版本號,OSX_AVALIABALE_STARTING()這個宏可以標識MAC OS和IOS
比如: _OSX_AVALABLE(_MAC_10_2,_IPHONE_2_0)表示這個函數可用的最低的版本是MAC OS X 10.2和IOS 2.0.
如果一個函數在一個平臺上可用,在另一個不可用,會加上_NA(not applicable)這個屬性。
比如: _OSX_AVALIBLE_STARTING(_MAC_10_3,_IPHONE_NA)標識最低可用於MAC OS的版本是
MAC OS 10.3,在IOS平臺上不可用。
有時,一個函數/方法被拋棄了。這表示蘋果推不推薦使用者再使用這個函數,或者有更好的替代的函數。
被拋棄的方法/函數,可以被標記爲:
_OSX_AVAILABLE_BUT_DEPRECATED()的宏,表示該函數/方法是可用的,但是也是被拋棄了的。
比如說:
_OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_5,__IPHONE_NA,__IPHONE_NA),表示在在MAC10.0的時候被引入了,
在MAC 10.5的時候被拋棄了。在IOS平臺中這個函數是不可用的。
爲了這些宏正常的使用,程序必須指定程序的系統版本。爲編譯器的指定最低的系統版本:當在MAC OS下編譯程序的時候,表示爲
-mmacos-version-min = 10.x ,
當在IOS下編譯程序的時候表示爲 -miphone-version-min=1.x.x。最高的編譯版本是很少需要,
但是可以通過命令行:MAC OS 下形如,-D__MAC_OS_X_VERSION_MAX_ALLOWED=10xx ,
IOS下形如,__IPHONE_OS_VERSION_MAX_ALLOWED = 1xxx .
例子:
一個函數在MAC OS X 10.5及其以後版本可用,但是在IOS下是不可用的。
extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
一個OC函數在MAC OS X 10.5及其以後版本可用,但是在IOS下是不可用的。
@interface MyClass : NSObject
-(void) mymacmethod __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
@end 一個枚舉變量在IOS 2.1及其以後版本可用,但是在MAC OS中是不可用的
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 20100 enum { myEnum = 1 }; #endif
筆記:這個枚舉在MAC OS平臺上是起作用的因爲
__IPHONE_OS_VERSION_MIN_REQUIRED 沒有定義,這個值爲0,所以#if 0>20100爲錯。同時,我們用20100代替 __IPHone_2_1是安全的,
__IPHONE_2_1 在2.1SDK以前的<Availability.h>中是不存在的。所以,用於以前的版本的時候,這將是不正確的。
在源代碼中使用 *_VERSION_MIN_REQUIRED也是可能的,使某個源代碼在目標的系統下是可編譯的。最好是不要用
_MAC_* 和 __IPHONE_*宏來做比較,而是用他們的所定義的值。這是因爲在低版本的環境中沒用定義那個宏。
在C 的預編譯中這個宏將表示爲0,這將導致在#if表達式中造成錯誤。
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
// code only compiled when targeting Mac OS X and not iPhone
// note use of 1050 instead of __MAC_10_5
#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1050
// 在這裏編寫適用於雪豹系統之前的版本的代碼
#else
// 在這裏編寫適用於雪豹系統之後的版本的代碼
#endif
#endif
*/
#define __MAC_10_0 1000
#define __MAC_10_1 1010
#define __MAC_10_2 1020
#define __MAC_10_3 1030
#define __MAC_10_4 1040
#define __MAC_10_5 1050
#define __MAC_10_6 1060
#define __MAC_NA 9999 /* not available */
#define __IPHONE_2_0 20000
#define __IPHONE_2_1 20100
#define __IPHONE_2_2 20200
#define __IPHONE_3_0 30000
#define __IPHONE_NA 99999 /* not available */
#include<AvailabilityInternal.h>
#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
#define __OSX_AVAILABLE_STARTING(_mac, _iphone) __AVAILABILITY_INTERNAL##_iphone
#define __OSX_AVAILABLE_BUT_DEPRECATED(_macIntro, _macDep, _iphoneIntro, _iphoneDep) \
__AVAILABILITY_INTERNAL##_iphoneIntro##_DEP##_iphoneDep
#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#define __OSX_AVAILABLE_STARTING(_mac, _iphone) __AVAILABILITY_INTERNAL##_mac
#define __OSX_AVAILABLE_BUT_DEPRECATED(_macIntro, _macDep, _iphoneIntro, _iphoneDep) \
__AVAILABILITY_INTERNAL##_macIntro##_DEP##_macDep
#else
#define __OSX_AVAILABLE_STARTING(_mac, _iphone)
#define __OSX_AVAILABLE_BUT_DEPRECATED(_macIntro, _macDep, _iphoneIntro, _iphoneDep)
#endif
#endif/* __AVAILABILITY__ */