是否可以拥有自定义可用性宏,例如__OSX_AVAILABLE_STARTING。我需要它以相同的方式执行,我只需要更改其名称和版本以及参数数量?
答案 0 :(得分:7)
是的,当然。 Objective-C是C的严格超集,因此C宏非常适合您,并且该工具只是一组C宏,最终扩展到
gcc's __attribute__
keyword to declare special attributes of a function
相关声明均在
中要刷新,您可以使用__OSX_AVAILABLE_STARTING
宏将函数声明标记为特定版本支持,如下所示:
extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
那么我们自己需要做什么呢?如果剥掉他们的 支持两种不同的OS(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
中的thos,指定每个版本应该发生的事情(常规支持,弃用,不可用,弱等)。同样,这是编译器的一个功能,请参阅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__
工具的宏。
对于我上面的那些,你可以继续使用Apple的宏:
#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宏是强大的东西,经常被忽视。祝你好运!