Availability.h -like宏

时间:2012-05-08 14:32:17

标签: iphone ios objective-c cocoa

是否可以拥有自定义可用性宏,例如__OSX_AVAILABLE_STARTING。我需要它以相同的方式执行,我只需要更改其名称和版本以及参数数量?

1 个答案:

答案 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),可用性设施归结为:

  1. 采用类似__MY_AVAILABLE_STARTING(<version>)的版本参数的宏:

    #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. 另一组宏,如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
    
  4. 最后,降压结束的地方,扩展到__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")))
    

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

  5. C宏是强大的东西,经常被忽视。祝你好运!