可用性类似于macros

是否有可能具有像__OSX_AVAILABLE_STARTING这样的自定义可用性macros。 我需要它以相同的方式执行,我只需要更改它的名称和参数的版本和数量?

是的,当然了。 Objective-C是C的一个严格的超集,所以Cmacros可以随意使用,而这个工具只是一组Cmacros,最终扩展为gcc的__attribute__关键字来声明一个函数的特殊属性 。

相关的声明都在

  • Availability.h
  • AvailabilityInternal.h

要进行刷新,可以使用__OSX_AVAILABLE_STARTINGmacros将函数声明标记为受特定版本支持,如下所示:

 extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA); 

那么我们需要自己来实现呢? 如果您剥离了对两种不同操作系统(mac,iphone)的支持,可用性工具归结为:

  1. 使用__MY_AVAILABLE_STARTING(<version>)类的版本参数的macros:

     #define __MY_AVAILABLE_STARTING(_myversion) __MY_AVAILABILITY_INTERNAL##_myversion 
  2. 版本参数的集合,就像Availability.h那些参数,它们是上面的有效参数:

     #define __MYVER_2_0 20000 #define __MYVER_2_1 20100 #define __MYVER_2_2 20200 #define __MYVER_3_0 30000 
  3. 另一组macros,如AvailabilityInternal.h中的thos,指定每个版本(常规支持,不build议使用,不可用,弱等)应发生的情况。 再次,这是编译器的function,请参阅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 
  4. 最后,降压结束后,扩展到__attribute__设施的macros。

    对于我上面的那些,你可以继续使用苹果的macros:

     #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"))) 

    或者,当然,你可以定义自己的疯狂。

Cmacros是强大的东西,经常被忽视。 祝你好运!