【iOS】iOS警告收录与消除方法
原文转自:董铂然 原文较老,对其中的代码做了部分修改
前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作。其实大部分的警告都是很好改的,把自己整个项目的警告撸一遍应该也就耗费半小时的时间,一次麻烦带来之后的清净这样不好么?
本文分为三个部分:
- 简单粗暴的消除警告。
- 详细科学的消除警告。(包括警告收录)
- 添加警告。
一、简单粗暴的消除警告
警告如果是自己项目中的还好直接改了,如果是第三方库,你改了之后,pod下作者更新一下又白改了,所以可以用这种简单粗暴的方法:直接让第三方库的警告不显示
就是在podfile文件里面加上一行指令 。
inhibit_all_warnings!
如果某警告实在无法消除,但是又不想让他显示,可以加入预编译指令
比如我已经知道某行会报上面警告了,我就用这个宏把这几行包住,就不会报引号中-Wunused-variable的警告了
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wunused-variable"
//这里是会报警告的代码
#pragma clang diagnostic pop
这个-Wunused-variable代表的意思就是有的东西你实例化了但是没有使用(同上面第几条)。 但是如何得到一个警告的标示符?
如图选择一个警告,点击右键,reveal in log 就能看到右边有个方括号[]里面的东西就是 这个警告对应的标示符

如果希望整个项目中都忽略 某种很无聊的警告,就在项目中Build Setting里加上这个标示符,可以连着加的。

如果不想整个项目都忽略,只想个别文件忽略,那就找到个别文件加上此指令,这个操作应该使用率不高(一般都是全项目忽略),就不上图了。去Build Phases 里面的 Compile Sources里面改。
二、详细科学的消除警告
其实笔者本意是想把一些第一眼看不懂比较坑的警告收录进来,但是后来发现那基本没几个需要些写了,所以就采用了全收录的方法,遇到的就记录下以后也会不断更新。
可以直接按command+F 在本页面搜索警告
Unused variable 'replyURL'
没有使用
Cannot find protocol definition for 'TencentSessionDelegate'
这种明明都能运行还说我没有定义的警告,是因为你这个协议虽然定义了,但是你这个协议可能还遵守了XX协议,然后这个XX协议没有定义导致会报这种警告,所以遇到这种警告要往“父协议”找。 举个栗子,上面这行就是腾讯授权的库里面报的警告,
@protocol TencentSessionDelegate<NSObject, TencentLoginDelegate, TencentApiInterfaceDelegate, TencentWebViewDelegate>
此协议遵守了TencentApiInterfaceDelegate协议,在TencentOAuth.h类中#import "TencentApiInterface.h" 警告可破
Null passed to a callee that requires a non-null argument
这个警告比较新,是xcode6.3开始 为了让OC也能有swift的?和!的功能,你在声明一个属性的时候加上 __nullable(?可以为空)与__nonnull(!不能为空) 如果放在@property里面的话不用写下划线
@property (nonatomic, copy, nonnull) NSString * tickets;
@property (nonatomic, copy) NSString * __nonnull tickets;
或者用宏NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END 包住多个属性全部具备nonnull,然后仅对需要nullable的改下就行,有点类似于f-no-objc-arc那种先整体给个路线在单独改个别文件的思想。 此警告就是某属性说好的不能为空,你又在某地方写了XX = nil 所以冲突了。
Auto property synthesis will not synthesize property 'privateCacheDirectory'; it will be implemented by its superclass, use @dynamic to acknowledge intention
他说你的父类实现了setget方法,但是如果你什么都不写,就会系统自动生成出最一般的setget方法,请用@dynamic 来承认父类实现的这个getset方法。
Unsupported Configuration: Scene is unreachable due to lack of entry points and does not have an identifier for runtime access via -instantiateViewControllerWithIdentifier:.
一般是storyboard报的警告,简而言之就是你有的页面没有和箭头所指的控制器连起来,导致最终改页面可能无法显示。
Deprecated: Push segues are deprecated in iOS 8.0 and later
iOS8之后呢,不要再用push拖线了,统一用show,他会自己根据你是否有导航栏来判断走push还是走modal
Unsupported Configuration: Plain Style unsupported in a Navigation Item
导航栏的item 不支持用plain ,那就用Bordered呗。
The launch image set "LaunchImage" has 2 unassigned images.
The app icon set "AppIcon" has 2 unassigned images.
几张图标还是启动图找不到自己的位置,可能是一次导入了全部尺寸图片,但是右边的设置只勾了iOS8的 那iOS7尺寸的图标就会报此警告。删掉,或者对照右边匹配。
'sizeWithFont:constrainedToSize:lineBreakMode:' is deprecated: first deprecated in iOS 7.0 - Use -boundingRectWithSize:options:attributes:context:
方法废除,旧的方法sizeWithFontToSize在iOS7后就废除了取而代之是boundingRectWithSize方法
Undeclared selector 'historyAction'
使用未声明的方法,一般出现在@selector() 括号里写了个不存在的方法或方法名写错了。
PerformSelector may cause a leak because its selector is unknown
这个和上面类似就是直接把上面那个@SEL拿来用会报这个警告
'strongify' macro redefined
这个宏声明重复,删一个吧
'UITextAttributeFont' is deprecated: first deprecated in iOS 7.0 - Use NSFontAttributeName
'UITextAttributeTextColor' is deprecated: first deprecated in iOS 7.0 - Use NSForegroundColorAttributeName
'UITextAttributeTextShadowColor' is deprecated: first deprecated in iOS 7.0 - Use NSShadowAttributeName with an NSShadow instance as the value
方法废除,一般一起出现
Code will never be executed
这代码永远也轮不到他执行,估计是有几行代码写在了return之后
Assigning to 'id' from incompatible type 'SXTabViewController *const __strong'
一般出现在xxx.delegate = self ,应该在上面遵守协议
Format specifies type 'unsigned long' but the argument has type 'unsigned int'
这个警告一般会出现在NSStringWithFormat里面 前面%d %lu 什么的和后面填进去的参数不匹配就报了警告
Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead
类似于上面,也是format里面前后写的不匹配
Method 'dealWithURL:andTitle:andKeyword:' in protocol 'SXPostAdDelegate' not implemented
经典警告,遵守了协议,但是没有实现协议方法。 也可能你实现了只是又加了个参数或是你写的方法和协议方法名字有点轻微不同
Using integer absolute value function 'abs' when argument is of floating point type
这个可以自动修正,就是说abs适用于整数绝对值,要是float取绝对值要用fabsf
Attribute Unavailable: Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
有的方法你用的太落后了,也有的方法你用的太超前了。 说这个最大宽度在iOS8之前的系统是要坑的
Too many personality routines for compact unwind to encode
你可以在otherlink 中加入 -Wl,-no_compact_unwind 去掉该警告,根据苹果的解释,这个是由于某些地方 c/c++/oc/oc++混用会造成编译警告。一般没有什么伤害。
Property 'ssid' requires method 'ssid' to be defined - use @synthesize, @dynamic or provide a method implementation in this class implementation
说这个ssid必须要定义个这个属性的getter方法,如果警告是setSsid就是setter方法, 用@synthesize和@dynamic 都行,一个是让编译器生成getter和setter,一个是自己生成,如果你有模型分发或kvc之类的,选@dynamic就行
Unknown escape sequence ')'
未知的转义序列。 一般有个斜杠再加个东西他都会以为是转义字符,一看\)不认识就报警告了,一般正则表达式容易报这种警告
Property 'LoginPort' not found on object of type 'LoginLvsTestTask *'; did you mean to access property loginPort?
这种可以点击自动修复,是典型的大小写写错了,他提醒了一下。
Variable 'type' is used uninitialized whenever switch default is taken
这是出现在switch语句中的警告, 一般可能是switch外面定义了个type但是并没有初始化(初始化操作都写在switch的各个分支里),然后在最后return type。 但是switch的有个分支没有对type初始化,他说如果你来到这个分支的话,那还没初始化就要被return。
三、添加警告
1.首先最常用的就是 普通警告,这也没什么好说的了
#warning TODO
2.如果是自己写的文件或第三方库,有了新的接口,然后提示旧的接口废除的话需要在方法后加上宏NS_DEPRECATED_IOS和范围
- (void)addTapAction:(SEL)tapAction target:(id)target NS_DEPRECATED_IOS(2_0, 4_0);
3.如果需要在此方法后加上带信息的警告则需要这么写
- (void)addTapAction:(SEL)tapAction target:(id)target __attribute__((deprecated("这个接口已废弃,建议使用...代替")));
//系统提供了宏可以简单使用
- (void)addTapAction:(SEL)tapAction target:(id)target DEPRECATED_MSG_ATTRIBUTE("这个接口已废弃,建议使用...代替");
显示的效果像这样:

内容的补充:
//精确忽略指定代码块的警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "警告名称"
// 被夹在这中间的代码针对于此警告都会忽视不显示出来
//常见警告的名称
//1.声明变量未使用 "-Wunused-variable"
//2.方法定义未实现 "-Wincomplete-implementation"
//3.未声明的选择器 "-Wundeclared-selector"
//4.参数格式不匹配 "-Wformat"
//5.废弃掉的方法 "-Wdeprecated-declarations"
//6.不会执行的代码 "-Wunreachable-code"
//7.忽略在arc 环境下performSelector产生的 leaks 的警告 "-Warc-performSelector-leaks"
//8.忽略类别方法覆盖的警告 "-Wobjc-protocol-method-implementation"(修复开源库bug,覆盖开源库方法时会用到)
#pragma clang diagnostic pop
大范围忽略指定警告
不推荐,警告放开有利于及时查找问题,大范围忽略警告容易导致一些隐匿性的错误难以定位
可以在pch等具有大范围作用域的头文件中包含:
#pragma clang diagnostic ignored "警告名称"
如果剔除了push与pop 则后面所有的代码都具有强制消除警告作用
【iOS】iOS警告收录与消除方法的更多相关文章
- iOS警告收录及科学快速的消除方法
来自: http://www.cnblogs.com/dsxniubility/p/4757760.html iOS警告收录及科学快速的消除方法 前言:现在你维护的项目有多少警告?看着几百条警 ...
- iOS 警告收录及科学快速的消除方法
http://www.cocoachina.com/ios/20150914/13287.html 作者:董铂然 授权本站转载. 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉 ...
- iOS 警告收集快速消除
1.ld: warning: directory not found for option 去掉警告的方法 工程老是提示ld: warning: directory not found for opt ...
- iOS 去除警告 看我就够了
你是不是看着开发过程中出现的一堆的警告会心情一阵烦躁,别烦躁了,看完此文章,消除警告的小尾巴. 一.SVN 操作导致的警告 1.svn删除文件后报错 ”xx“is missing from worki ...
- ios CoreBluetooth 警告 is being dealloc'ed while pending connection
ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...
- iOS开发 GET、POST请求方法(NSURLSession篇)
NSURLConnection,在iOS9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: [iOS开发 GET.POST请求方法(NSURLConnectio ...
- iOS开发 GET、POST请求方法(NSURLConnection篇)
Web Service使用的主要协议是HTTP协议,即超文本传输协议. HTTP/1.1协议共定义了8种请求方法(OPTIONS.HEAD.GET.POST.PUT.DELETE.TRACE.CONN ...
- IOS中图片拉伸技巧与方法总结(转载)
以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...
- iOS——浅谈iOS中三种生成随机数方法
ios 有如下三种随机数方法:
- iOS项目的完整重命名方法图文教程
原文链接:http://www.cocoachina.com/ios/20150104/10824.html iOS项目的完整重命名方法图文教程 前言:在iOS开发中,有时候想改一下项目的名字,都会遇 ...
随机推荐
- Kafka入门实战教程(3).NET Core操作Kafka
1 可用的Kafka .NET客户端 作为一个.NET Developer,自然想要在.NET项目中集成Kafka实现发布订阅功能.那么,目前可用的Kafka客户端有哪些呢? 目前.NET圈子主流使用 ...
- 红米k30s/k40刷magisk面具+LSPosed+大圣净化
解锁BL 这里查看官方教程即可 ,如果小米手机解锁bl遇到1004的错误,用洋大人的版本即可 需要注意,新机购买7天才能允许解锁! 提取boot 下载固件包,使用提取工具进行提取boot.img 固件 ...
- hot_driver's 评语
1)没有学会用面向对象的思维去分析和设计,比如:当我们要抽象出一个LED类,那么我们应该定义它的属性和操作.而我看到LED只有属性,而没有操作.常见的操作是关灯.开灯.调整亮度.调整颜色:而这些操作被 ...
- linux 虚拟内存增加
简介 增加内存以跑动大内存程序 https://www.cnblogs.com/lori/p/13344060.html 主要命令 增加10个G的虚拟内存 sudo dd if=/dev/zero o ...
- 如何选择最适合企业的ETL解决方案?
在今天的大数据时代,企业的数据管理和处理变得愈发重要.企业也越来越依赖于数据仓库和数据湖来提取.转换和加载(ETL)关键业务信息.一个高效.灵活的ETL解决方案不仅能提升数据处理能力,还能为企业决策提 ...
- Esbuild-新一代极速前端构建打包工具
什么是 Esbuild? Esbuild 是由 Figma 的 CTO 「Evan Wallace」基于 Golang 开发的一款打包工具,相比传统的打包工具,主打性能优势,在构建速度上可以快 10~ ...
- 兰空图床LSKY安装指南
1. 下载兰空图床 cd ~ && \ mkdir lsky && \ cd lsky && \ wget https://github.com/lsk ...
- POLIR-Laws-Constitution消费者权益保护法: 全文@国家市场监督管理总局 《中华人民共和国消费者权益保护法》
POLIR-Laws-Constitution消费者权益保护法: 全文@国家市场监督管理总局 <中华人民共和国消费者权益保护法> 中华人民共和国消费者权益保护法 发布时间:2020-07- ...
- MacOS-“System Information”这个App用做USB设备的检测与设备文件的确定
"System Information"这个Apple自带的GUI小App是检测USB硬件的; 如图所示: 而Linux上是 lsusb 与 lspci 这类command lin ...
- MySQL 19 为什么我只查一行的语句,也执行这么慢?
有些情况下,"查一行"也会执行特别慢,今天就看看什么情况会出现这个现象. 如果MySQL本身有很大压力,导致数据库服务器CPU占有率很高或IO利用率很高,这种情况所有语句的执行都可 ...