是否可以有一个自定义可用性宏,例如 __OSX_AVAILABLE_STARTING 。我需要它以同样的方式执行,我只需要更改它的名称以及参数的版本和数量?
是的,当然了。 Objective-C 是 C 的严格超集,因此 C 宏非常适合您使用,并且该工具只是一组最终扩展为的 C 宏gcc's __attribute__关键字声明函数的特殊属性 http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html.
相关声明均在
- Availability.h http://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/Availability.h
- AvailabilityInternal.h http://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/AvailabilityInternal.h
要刷新,您可以使用__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 http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html(还有很多其他有趣的选项):
#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 宏是强大的东西,但经常被忽视。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)