是否可以有一个自定义可用性宏,例如 __OSX_AVAILABLE_STARTING。我需要它以相同的方式执行,我只需要更改它的名称以及参数的版本和数量?
问问题
1284 次
1 回答
7
是的,当然了。Objective-C 是 C 的严格超集,因此 C 宏非常任您使用,而该工具只是一组 C 宏,最终扩展为
gcc 的__attribute__
关键字以声明函数的特殊属性。
相关声明都在
要刷新,您可以使用__OSX_AVAILABLE_STARTING
宏将函数声明标记为特定版本支持,如下所示:
extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
那么我们自己需要什么来实现呢?如果您剥离他们对两种不同操作系统(mac、iphone)的支持,可用性工具可以归结为:
一个接受版本参数的宏,例如
__MY_AVAILABLE_STARTING(<version>)
:#define __MY_AVAILABLE_STARTING(_myversion) __MY_AVAILABILITY_INTERNAL##_myversion
一组版本参数,如 中的那些
Availability.h
,它们是上述的有效参数:#define __MYVER_2_0 20000 #define __MYVER_2_1 20100 #define __MYVER_2_2 20200 #define __MYVER_3_0 30000
另一组宏,例如
AvailabilityInternal.h
指定每个版本应该发生的事情(常规支持、已弃用、不可用、弱等)。同样,这是编译器的一个功能,请参阅gcc docs
(还有很多其他有趣的选项):#define __MY_AVAILABILITY_INTERNAL__MYVER_2_0 __AVAILABILITY_INTERNAL_UNAVAILABLE #define __MY_AVAILABILITY_INTERNAL__MYVER_2_1 __AVAILABILITY_INTERNAL_WEAK_IMPORT #define __MY_AVAILABILITY_INTERNAL__MYVER_2_1 __AVAILABILITY_INTERNAL_REGULAR
最后,在降压结束的地方,扩展到
__attribute__
设施的宏。对于我上面的那些,你可以继续使用苹果的宏:
#define __AVAILABILITY_INTERNAL_DEPRECATED __attribute__((deprecated,visibility("default"))) #define __AVAILABILITY_INTERNAL_UNAVAILABLE __attribute__((unavailable,visibility("default"))) #define __AVAILABILITY_INTERNAL_WEAK_IMPORT __attribute__((weak_import,visibility("default"))) #define __AVAILABILITY_INTERNAL_REGULAR __attribute__((visibility("default")))
或者,当然,你可以定义你自己的疯狂。
C 宏是强大的东西,但经常被忽视。祝你好运!
于 2012-05-09T06:26:22.343 回答