可用性类似于macros
是否有可能具有像__OSX_AVAILABLE_STARTING这样的自定义可用性macros。 我需要它以相同的方式执行,我只需要更改它的名称和参数的版本和数量?
是的,当然了。 Objective-C是C的一个严格的超集,所以Cmacros可以随意使用,而这个工具只是一组Cmacros,最终扩展为gcc的__attribute__
关键字来声明一个函数的特殊属性 。
相关的声明都在
-
Availability.h
-
AvailabilityInternal.h
要进行刷新,可以使用__OSX_AVAILABLE_STARTING
macros将函数声明标记为受特定版本支持,如下所示:
extern void mymacfunc() __OSX_AVAILABLE_STARTING(__MAC_10_5,__IPHONE_NA);
那么我们需要自己来实现呢? 如果您剥离了对两种不同操作系统(mac,iphone)的支持,可用性工具归结为:
-
使用
__MY_AVAILABLE_STARTING(<version>)
类的版本参数的macros:#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
-
另一组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
-
最后,降压结束后,扩展到
__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是强大的东西,经常被忽视。 祝你好运!