原文转自:董铂然 原文较老,对其中的代码做了部分修改

前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉得警告又不是错误可以完全不管么? 如果你也被这些问题困惑,可以和我一起进行下面的操作。其实大部分的警告都是很好改的,把自己整个项目的警告撸一遍应该也就耗费半小时的时间,一次麻烦带来之后的清净这样不好么?

本文分为三个部分:

  • 简单粗暴的消除警告。
  • 详细科学的消除警告。(包括警告收录)
  • 添加警告。

一、简单粗暴的消除警告

警告如果是自己项目中的还好直接改了,如果是第三方库,你改了之后,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 在本页面搜索警告

  1. Unused variable 'replyURL'

    没有使用

  2. Cannot find protocol definition for 'TencentSessionDelegate'

    这种明明都能运行还说我没有定义的警告,是因为你这个协议虽然定义了,但是你这个协议可能还遵守了XX协议,然后这个XX协议没有定义导致会报这种警告,所以遇到这种警告要往“父协议”找。 举个栗子,上面这行就是腾讯授权的库里面报的警告,

    @protocol TencentSessionDelegate<NSObject, TencentLoginDelegate, TencentApiInterfaceDelegate, TencentWebViewDelegate>

    此协议遵守了TencentApiInterfaceDelegate协议,在TencentOAuth.h类中#import "TencentApiInterface.h" 警告可破

  3. 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 所以冲突了。

  1. Auto property synthesis will not synthesize property 'privateCacheDirectory'; it will be implemented by its superclass, use @dynamic to acknowledge intention

    他说你的父类实现了setget方法,但是如果你什么都不写,就会系统自动生成出最一般的setget方法,请用@dynamic 来承认父类实现的这个getset方法。

  2. Unsupported Configuration: Scene is unreachable due to lack of entry points and does not have an identifier for runtime access via -instantiateViewControllerWithIdentifier:.

    一般是storyboard报的警告,简而言之就是你有的页面没有和箭头所指的控制器连起来,导致最终改页面可能无法显示。

  3. Deprecated: Push segues are deprecated in iOS 8.0 and later

    iOS8之后呢,不要再用push拖线了,统一用show,他会自己根据你是否有导航栏来判断走push还是走modal

  4. Unsupported Configuration: Plain Style unsupported in a Navigation Item

    导航栏的item 不支持用plain ,那就用Bordered呗。

  5. The launch image set "LaunchImage" has 2 unassigned images.

    The app icon set "AppIcon" has 2 unassigned images.

    几张图标还是启动图找不到自己的位置,可能是一次导入了全部尺寸图片,但是右边的设置只勾了iOS8的 那iOS7尺寸的图标就会报此警告。删掉,或者对照右边匹配。

  6. 'sizeWithFont:constrainedToSize:lineBreakMode:' is deprecated: first deprecated in iOS 7.0 - Use -boundingRectWithSize:options:attributes:context:

    方法废除,旧的方法sizeWithFontToSize在iOS7后就废除了取而代之是boundingRectWithSize方法

  7. Undeclared selector 'historyAction'

    使用未声明的方法,一般出现在@selector() 括号里写了个不存在的方法或方法名写错了。

  8. PerformSelector may cause a leak because its selector is unknown

    这个和上面类似就是直接把上面那个@SEL拿来用会报这个警告

  9. 'strongify' macro redefined

这个宏声明重复,删一个吧
  1. '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

方法废除,一般一起出现
  1. Code will never be executed

    这代码永远也轮不到他执行,估计是有几行代码写在了return之后

  2. Assigning to 'id' from incompatible type 'SXTabViewController *const __strong'

    一般出现在xxx.delegate = self ,应该在上面遵守协议

  3. Format specifies type 'unsigned long' but the argument has type 'unsigned int'

    这个警告一般会出现在NSStringWithFormat里面 前面%d %lu 什么的和后面填进去的参数不匹配就报了警告

  4. Values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead

    类似于上面,也是format里面前后写的不匹配

  5. Method 'dealWithURL:andTitle:andKeyword:' in protocol 'SXPostAdDelegate' not implemented

    经典警告,遵守了协议,但是没有实现协议方法。 也可能你实现了只是又加了个参数或是你写的方法和协议方法名字有点轻微不同

  6. Using integer absolute value function 'abs' when argument is of floating point type

    这个可以自动修正,就是说abs适用于整数绝对值,要是float取绝对值要用fabsf

  7. Attribute Unavailable: Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0

有的方法你用的太落后了,也有的方法你用的太超前了。 说这个最大宽度在iOS8之前的系统是要坑的
  1. Too many personality routines for compact unwind to encode

    你可以在otherlink 中加入 -Wl,-no_compact_unwind 去掉该警告,根据苹果的解释,这个是由于某些地方 c/c++/oc/oc++混用会造成编译警告。一般没有什么伤害。

  2. 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就行

  3. Unknown escape sequence ')'

未知的转义序列。 一般有个斜杠再加个东西他都会以为是转义字符,一看\)不认识就报警告了,一般正则表达式容易报这种警告
  1. Property 'LoginPort' not found on object of type 'LoginLvsTestTask *'; did you mean to access property loginPort?

    这种可以点击自动修复,是典型的大小写写错了,他提醒了一下。

  2. 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警告收录与消除方法的更多相关文章

  1. iOS警告收录及科学快速的消除方法

    来自: http://www.cnblogs.com/dsxniubility/p/4757760.html iOS警告收录及科学快速的消除方法     前言:现在你维护的项目有多少警告?看着几百条警 ...

  2. iOS 警告收录及科学快速的消除方法

    http://www.cocoachina.com/ios/20150914/13287.html 作者:董铂然 授权本站转载. 前言:现在你维护的项目有多少警告?看着几百条警告觉得心里烦么?你真的觉 ...

  3. iOS 警告收集快速消除

    1.ld: warning: directory not found for option 去掉警告的方法 工程老是提示ld: warning: directory not found for opt ...

  4. iOS 去除警告 看我就够了

    你是不是看着开发过程中出现的一堆的警告会心情一阵烦躁,别烦躁了,看完此文章,消除警告的小尾巴. 一.SVN 操作导致的警告 1.svn删除文件后报错 ”xx“is missing from worki ...

  5. ios CoreBluetooth 警告 is being dealloc'ed while pending connection

    ios CoreBluetooth 警告 is being dealloc'ed while pending connection CoreBluetooth[WARNING] <CBPerip ...

  6. iOS开发 GET、POST请求方法(NSURLSession篇)

    NSURLConnection,在iOS9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: [iOS开发 GET.POST请求方法(NSURLConnectio ...

  7. iOS开发 GET、POST请求方法(NSURLConnection篇)

    Web Service使用的主要协议是HTTP协议,即超文本传输协议. HTTP/1.1协议共定义了8种请求方法(OPTIONS.HEAD.GET.POST.PUT.DELETE.TRACE.CONN ...

  8. IOS中图片拉伸技巧与方法总结(转载)

    以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...

  9. iOS——浅谈iOS中三种生成随机数方法

    ios 有如下三种随机数方法:

  10. iOS项目的完整重命名方法图文教程

    原文链接:http://www.cocoachina.com/ios/20150104/10824.html iOS项目的完整重命名方法图文教程 前言:在iOS开发中,有时候想改一下项目的名字,都会遇 ...

随机推荐

  1. HarmonyOS NEXT仓颉开发语言实战案例:外卖App

    各位周末好,今天为大家来仓颉语言外卖App的实战分享. 我们可以先分析一下页面的布局结构,它是由导航栏和List容器组成的.幽蓝君目前依然没有找到仓颉语言导航栏的系统组件,还是要自定义,这个导航栏有三 ...

  2. .NET 全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  3. Web前端入门第 78 问:JavaScript 比较少见的模版字符串用法

    在 ES6 之前,JS 的多行字符串一直是开发难题,在处理多行字符串时,各种各样的方案都有~~ 在 JS 中,如果直接这样写多行字符串: const str1 = '第一行 第二行'; 那浏览器转过来 ...

  4. iPaas数据传输的方式

    一.iPaas平台概述 iPaas(Integration Platform as a Service)平台,作为一种先进的云计算服务模式,为开发者和企业提供了一种全面且灵活的应用集成解决方案.它构建 ...

  5. Product-Mechanics: 玻璃:开模+ 浇筑 量产: 高硼硅玻璃/容器/器皿

    Product-Mechanics: 塑料:开模+挤塑量产 高硼硅玻璃: 专利: https://www.xjishu.com/zhuanli/25/201910127975.html 例如化学仪器设 ...

  6. 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】

    动态生成最新行政区划 GeoJSON 数据并结合 ECharts 实现地图下钻功能 在开发基于地图的数据可视化应用时,一个常见的挑战是获取准确且最新的行政区划边界数据(GeoJSON).许多现有的在线 ...

  7. 关于CefSharp中C#与JS函数互相调用的应用

    作者:咕魂 时间:2022年5月6日 大量博文可以看到一些C#与JS脚本相互调用的案例,但是不同版本的CefSharp使用时还是有一点不同,博主本次使用的CefSharp版本为100.0.230.0, ...

  8. 《HelloGitHub》第 112 期

    兴趣是最好的老师,HelloGitHub 让你对开源感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...

  9. Thymeleaf作用

    Thymeleaf的主要作用是把model中的数据渲染到html中,因此其语法主要是如何解析model中的数据

  10. 银河麒麟V10(含SP1)下安装Win7虚拟机

    https://www.sohu.com/a/588125921_121174575 众所周知,因国产化电脑 CPU 与个人电脑中常见的 Intel 和 AMD 的 CPU 架构不同,所以无法直接安装 ...