2016-07-13 31 views
3

我已经下载了的XCode 8.2beta,为了固定在一个项目的警告我有以下添加到header fileCAAnimationDelete这只能从iOS的10检测在头文件协议的可用性 - Objective-C的

的问题是,只会增加该协议的项目没有在iOS versions前10编译,所以我增加了以下检查:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_9_3 
@interface CheckTest : UIView <CAAnimationDelegate> 
#else 
@interface CheckTest : UIView 
#endif 

这是正确的做法?

+1

看起来不错,但是你可能想使用'== IPHONE_10'或类似的东西,以防万一有一个iOS 9.4发布(不会有,但你知道)。你将不得不以类似的方式守卫委托方法实施,我假设... – Droppy

+0

@Droppy是的,没有想过这个!非常感谢:)如果你想发布它作为答案,所以我可以接受它 – Signo

回答

1

我相信你对守护宏的使用是正确的,只需稍做改动;要检查,如果编译为iOS 10+,所以测试,在宏:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 
@interface CheckTest : UIView <CAAnimationDelegate> 
#else 
@interface CheckTest : UIView 
#endif 

不要忘记守卫使用相同的后卫宏CAAnimationDelegate方法实现。

如果您在大量的类这样做,那么它可能是更方便的做到这一点在你的预编译头:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10 
#define VIEWS_USE_CAANIMATIONDELEGATE 1 
#else 
#define VIEWS_USE_CAANIMATIONDELEGATE 0 
#endif 

,改变后卫宏:

#if VIEWS_USE_CAANIMATIONDELEGATE 
@interface CheckTest : UIView <CAAnimationDelegate> 
#else 
@interface CheckTest : UIView 
#endif 
+0

谢谢!只是一个错字,我刚刚在'Availability.h'上找到了iOS 10的代码是'__IPHONE_10_0' – Signo

+0

@Signo谢谢;更新。 – Droppy

+0

有关记录:这种方法通常会在您使用较旧的iOS版本进行编译时中断,因为'__IPHONE_10_0'明显与iOS 10一起定义。但令人惊讶的是,该宏已经存在于'CABase.h'中。通常会发生的是,您对宏的值('100000')进行硬编码。 –