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

 

来自: http://www.cnblogs.com/dsxniubility/p/4757760.html

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

 

  

前言:如今你维护的项目有多少警告?看着几百条警告以为内心烦么?你真的以为警告又不是错误能够彻底无论么? 若是你也被这些问题困惑,能够和我一块儿进行下面的操做。其实大部分的警告都是很好改的,把本身整个项目的警告撸一遍应该也就耗费半小时的时间,一次麻烦带来以后的清净这样很差么?html

本文分为三个部分:1.简单粗暴的消除警告。 2.详细科学的消除警告。(包括警告收录)  3.添加警告。c++

若是你不是在董铂然博客园看到本文,请点击查看原文正则表达式

1、简单粗暴的消除警告

警告若是是本身项目中的还好直接改了,若是是第三方库,你改了以后,pod下做者更新一下又白改了,因此能够用这种简单粗暴的方法:直接让第三方库的警告不显示swift

 就是在podfile文件里面加上一行指令 。 xcode

inhibit_all_warnings!

 

若是某警告实在没法消除,可是又不想让他显示,能够加入预编译指令app

好比我已经知道某行会报上面警告了,我就用这个宏把这几行包住,就不会报引号中-Wunused-variable的警告了ide

1
2
3
4
5
6
#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wunused-variable"
 
                //这里是会报警告的代码
 
#pragma clang diagnostic pop

这个-Wunused-variable表明的意思就是 有的东西 你实例化了可是没有使用(同上面第几条)。 可是如何获得一个警告的标示符?post

如图选择一个警告,点击右键,reveal in log  就能看到右边有个方括号[]里面的东西就是 这个警告对应的标示符ui

 

若是但愿整个项目中都忽略 某种很无聊的警告,就在项目中Build Setting里加上这个标示符,能够连着加的。this

若是不想整个项目都忽略,只想个别文件忽略,那就找到个别文件加上此指令,这个操做应该使用率不高(通常都是全项目忽略),就不上图了。去Build Phases 里面的 Compile Sources里面改。

 

2、详细科学的消除警告

其实笔者本意是想把一些第一眼看不懂比较坑的警告收录进来,可是后来发现那基本没几个须要些写了,因此就采用了全收录的方法,遇到的就记录下之后也会不断更新。 能够直接按command+F 在本页面搜索警告

 

Unused variable 'replyURL'

1.没有使用

 

Cannot find protocol definition for 'TencentSessionDelegate'

2.这种明明都能运行还说我没有定义的警告,是由于你这个协议虽然定义了,可是你这个协议可能还遵照了XX协议,而后这个XX协议没有定义致使会报这种警告,因此遇到这种警告要往“父协议”找。 举个栗子,上面这行就是腾讯受权的库里面报的警告,

@protocol TencentSessionDelegate<NSObjectTencentLoginDelegateTencentApiInterfaceDelegateTencentWebViewDelegate>

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

 

 Null passed to a callee that requires a non-null argument

3.这个警告比较新,是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

4.他说你的父类实现了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:.

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

Deprecated: Push segues are deprecated in iOS 8.0 and later

6.iOS8以后呢,不要再用push拖线了,统一用show,他会本身根据你是否有导航栏来判断走push仍是走modal

 

Unsupported Configuration: Plain Style unsupported in a Navigation Item 

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

 

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

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

8.几张图标仍是启动图找不到本身的位置,多是一次导入了所有尺寸图片,可是右边的设置只勾了iOS8的 那iOS7尺寸的图标就会报此警告。删掉,或者对照右边匹配。

 

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

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

 

 Undeclared selector 'historyAction'

10.使用未声明的方法,通常出如今@selector() 括号里写了个不存在的方法或方法名写错了。

PerformSelector may cause a leak because its selector is unknown

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

 

 'strongify' macro redefined

12.这个宏声明重复,删一个吧

 

 '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

13.方法废除,通常一块儿出现

 

 Code will never be executed

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

 

 Assigning to 'id<SXTableViewDelegate>' from incompatible type 'SXTabViewController *const __strong'

15.通常出如今xxx.delegate = self ,应该在上面遵照协议

 

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

16.这个警告通常会出如今NSStringWithFormat里面 前面%d %lu 什么的和后面填进去的参数不匹配就报了警告

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

17.相似于上面,也是format里面先后写的不匹配

 

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

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

 

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

19.这个能够自动修正,就是说abs适用于整数绝对值,要是float取绝对值要用fabsf

 

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

20.有的方法你用的太落后了,也有的方法你用的太超前了。 说这个最大宽度在iOS8以前的系统是要坑的

 

 Too many personality routines for compact unwind to encode

21.你能够在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

22.说这个ssid必需要定义个这个属性的getter方法,若是警告是setSsid就是setter方法, 用@synthesize和@dynamic 都行,一个是让编译器生成getter和setter,一个是本身生成,若是你有模型分发或kvc之类的,选@dynamic就行

 

 Unknown escape sequence '\)'

23.未知的转义序列。 通常有个斜杠再加个东西他都会觉得是转义字符,一看\)不认识就报警告了,通常正则表达式容易报这种警告

 

Property 'LoginPort' not found on object of type 'LoginLvsTestTask *'; did you mean to access property loginPort?

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

 

Variable 'type' is used uninitialized whenever switch default is taken

25.这是出如今switch语句中的警告, 通常多是switch外面定义了个type可是并无初始化(初始化操做都写在switch的各个分支里),而后在最后return type。 可是switch的有个分支没有对type初始化,他说若是你来到这个分支的话,那还没初始化就要被return。

 

 

3、添加警告

1.首先最经常使用的就是 普通警告,这也没什么好说的了

1
#warning TODO

2.若是是本身写的文件或第三方库,有了新的接口,而后提示旧的接口废除的话须要在方法后加上宏NS_DEPRECATED_IOS和范围

1
- ( void )addTapAction:( SEL )tapAction target:( id )target  NS_DEPRECATED_IOS (2_0, 4_0);

3.若是须要在此方法后加上带信息的警告则须要这么写

1
- ( void )addTapAction:( SEL )tapAction target:( id )target __attribute(( deprecated ( "这个接口会爆内存 不建议使用" )));

显示的效果像这样:

相关文章
相关标签/搜索