抑制特定行的XCode编译警告

8

Ben Gottlieb的问题类似,我有一些过时的调用在困扰我。是否有一种方法可以按行抑制警告?例如:

 if([[UIApplication sharedApplication]
  respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {

  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
 } else {
  [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; //causes deprecation warning
 }

我只关心那一行代码。我不想关闭所有过时警告。我也不想做类似于按文件抑制特定警告的事情。

还有其他一些情况,我希望标记一个特定的代码行是可以的,即使编译器生成了一个警告。我基本上想让我的团队知道问题已经处理好了,不再反复提醒同一行代码的问题。

2个回答

5
发布了一个有趣的解决方案。简而言之:

点击此处

@protocol UIApplicationDeprecatedMethods
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated;
@end

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 
} else { 
    id<UIApplicationDeprecatedMethods> app = [UIApplication sharedApplication];
    [app setStatusBarHidden:YES animated:NO];
}

1
不幸的是,通常要么全部启用警告,要么全部禁用警告。 通过使用 #pragma GCC diagnostic ... (http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html),您可以在文件级别上基于特定需求禁用某些警告,这种方式比文件级别的构建设置更为明显。这需要使用 GCC 4.2+ 版本,并且必须放置在翻译单元的最顶部。 - mbauman
1
@matt-b FYI,我觉得我找到了一个更好的处理弃用警告的方法。如果我将UIApplication转换为(id),错误就会消失。你能想到这样做不当的原因吗? - MrHen
1
@MrHen:是的,有时确实会起作用。当您向id发送选择器时,编译器会检查至少有一个类能够响应这样的选择器。对于已弃用的选择器可能并非总是如此。如果没有,则会引发未找到方法的警告。因此,添加协议是更健壮的解决方案;它将始终避免警告的出现。 - mbauman
2
这对我有效,但我必须做一个更改。我的代码如下: id<UIApplicationDeprecatedMethods> app = (id)[UIApplication sharedApplication];否则,那一行会给我一个警告。 - William Jockusch
@MattB.:“编译器检查以确保至少有一些类能够响应这样的选择器。” 编译器只关心它在当前范围内被声明了某个地方。 它不关心在哪里。 由于您收到了弃用警告,因此它在某个地方被声明为已弃用。 因此,使用id将始终起作用。 - user102008
显示剩余2条评论

0
if([[UIApplication sharedApplication]
  respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {

  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
 } else {
  [(id)[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接