ios消除编译器警告的方法

本文介绍了如何在iOS开发中通过使用#pragma clang diagnostic指令来忽略编译时因使用弃用API产生的警告,包括PerformSelector、deprecated、nonnull、undeclared-selector和objc-property-synthesis等警告情况的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在iOS 不断的升级中,我们经常会遇到一些旧的api或者是属性已经弃用,系统提示采用新的API或者属性替换,可是为了版本上的兼容我们可能还是会用一些就的API或属性,这是系统编译出现黄色的警告,有强迫症的同学看了会非常不舒服。那么如何去掉呢?

1、如果是警告(PerformSelector may cause a leak because its selector is unknown)

 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
  //这里是弃用的API调用
 #pragma clang diagnostic pop

2、如果是警告(‘dismissModalViewControllerAnimated:’ is deprecated: first deprecated in iOS 6.0)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
//这里是弃用的属性
#pragma clang diagnostic pop

3、如果是警告(Null passed to a callee that requires a non-null argument)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
//这里是弃用的属性
#pragma clang diagnostic pop

4、如果是警告(Undeclared selector ‘DWJQkeyboardWillShow:’)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
//这里是弃用的属性
#pragma clang diagnostic pop

5、如果是警告(Auto property synthesis will not synthesize property ‘superColor’; it will be implemented by its superclass, use @dynamic to acknowledge intention)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-property-synthesis"
//这里是弃用的属性
#pragma clang diagnostic pop

6、如果警告类似(‘automaticallyAdjustsScrollViewInsets’ is deprecated: first deprecated in iOS 11.0 - Use UIScrollView’s contentInsetAdjustmentBehavior instead)

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
//这里是弃用的属性
        self.automaticallyAdjustsScrollViewInsets=YES;
#pragma clang diagnostic pop
### 如何消除 iOS 中 `UIApplication` 的 `openURL:` 方法产生的警告 在较新的 iOS 版本中,Apple 对应用间通信的安全性和隐私保护提出了更高的要求。当开发者尝试使用 `[UIApplication sharedApplication] openURL:]` 打开 URL 时,可能会遇到编译器发出的警告提示。这是因为 Apple 增加了一个必要的配置项——白名单机制。 #### 白名单机制简介 为了增强安全性并防止恶意软件滥用此功能,自 iOS 9 开始,任何需要调用外部链接的应用程序都必须在其 Info.plist 文件中声明允许访问哪些类型的 URL Scheme。如果未提前声明,则会触发运行时错误或警告[^1]^。 具体操作如下: 1. **编辑Info.plist文件** 需要在项目的 `Info.plist` 文件里新增一个键名为 `LSApplicationQueriesSchemes` 的数组类型属性,并向其中添加打算查询的所有可能使用的协议名称作为字符串值成员之一;例如要检测微信是否可用则应加入 `"weixin"` 字符串到列表当中去[^3]. 2. **代码调整前后的对比** 以下是修改之前直接调用的方式: ```objc NSURL *url = [NSURL URLWithString:@"http://example.com"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } ``` 而按照新规定之后正确的做法应该是先确认该scheme已被列入许可清单后再执行实际动作: ```objc // 确认 scheme 是否存在于 LSApplicationQueriesSchemes 中 NSString* customScheme = @"myapp"; if ([customScheme isEqualToString:@""]) { // 如果为空代表不需要特别处理 NSURL* urlToCheck = [NSURL URLWithString:[@"https://" stringByAppendingString:customScheme]]; } else{ NSURL* urlToCheck = [NSURL URLWithString:[@"myapp://" stringByAppendingString:@"" ]]; } if ([[UIApplication sharedApplication] canOpenURL:urlToCheck]) { BOOL success = [[UIApplication sharedApplication] openURL:urlToCheck options:@{} completionHandler:nil]; if (!success){ NSLog(@"Failed to launch %@", customScheme); } } ``` 注意这里我们还利用了现代 API 即带有选项参数版本的方法替代传统形式以便于未来兼容性考虑[^4]. 另外值得注意的是,在某些情况下即使完成了上述设置仍可能出现无法正常工作的现象,这通常是因为目标 App 并不支持所给定的 URL Scheme 或者设备上根本没有安装对应的应用所致[^2]. 因此建议开发人员除了做好技术层面的工作外也要充分考虑到用户体验方面的问题比如提供友好的反馈信息告诉用户当前状况以及可行解决方案等等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值