使用__IPHONE_7_0和respondsToSelector

时间:2013-12-29 23:28:52

标签: ios objective-c ios6 ios7 respondstoselector

我遇到了这段代码,我想知道#ifdef检查是否多余。

UIButton *doneButton = [[UIButton alloc] init];
...

#ifdef __IPHONE_7_0
    if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
        [doneButton setContentEdgeInsets:UIEdgeInsetsMake(0, 12, 0, -12)];
#endif

我尝试删除它并在iOS 6中运行它运行正常。在iOS 6/7中是否需要注意一些特殊情况导致它不会触发或导致崩溃?

2 个答案:

答案 0 :(得分:3)

#ifdef是一个编译时指令。如果项目是针对iOS 7 SDK构建的,那么只会编译#ifdef和#endif之间的代码。如果您针对iOS 6 SDK构建,则根本不会编译代码。

如果内部代码使用仅在iOS 7 SDK中定义的符号,#ifdef将阻止编译器错误。在您发布的代码中,我不确定它在做什么。 setContentEdgeInsets代码适用于大多数iOS版本。我认为代码应检查自己是否响应setEdgesForExtendedLayout,然后如果 响应则调用setEdgesForExtendedLayout。

答案 1 :(得分:1)

#ifdef是多余的。此外,根据__IPHONE_7_0的定义方式,可能会导致您的应用停止在iOS 8上运行。只需将其删除即可。