Availability.h -like宏

Joh*_*ane 2 iphone cocoa objective-c ios

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

ckh*_*han 7

是的,当然了.Objective-C是C的严格超集,因此C宏非常适合您,并且该工具只是一组C宏,最终扩展为 gcc的__attribute__关键字以声明函数的特殊属性.

相关的声明都在

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

extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
Run Code Online (Sandbox Code Playgroud)

那么我们自己需要做什么呢?如果你剥夺了对两种不同操作系统(mac,iphone)的支持,可用性设施归结为:

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

    #define __MY_AVAILABLE_STARTING(_myversion) __MY_AVAILABILITY_INTERNAL##_myversion
    
    Run Code Online (Sandbox Code Playgroud)
  2. 像上面那样的版本参数集Availability.h,它们是上面的有效参数:

    #define __MYVER_2_0     20000  
    #define __MYVER_2_1     20100  
    #define __MYVER_2_2     20200  
    #define __MYVER_3_0     30000  
    
    Run Code Online (Sandbox Code Playgroud)
  3. 另一组宏,如thos 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
    
    Run Code Online (Sandbox Code Playgroud)
  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")))
    
    Run Code Online (Sandbox Code Playgroud)

    或者,当然,您可以定义自己的疯狂.

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