iOS开发——项目实战总结&警告消除

警告消除

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

本文分为三个部分:

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

一、简单粗暴的消除警告

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

1.没有使用

  • Cannot find protocol definition for ‘TencentSessionDelegate‘

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

三、添加警告

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("这个接口会爆内存 不建议使用")));

显示的效果像这样:

时间: 2024-10-14 11:56:13

iOS开发——项目实战总结&警告消除的相关文章

iOS开发——项目实战技术OC篇&XMPP简单总结

XMPP简单总结 最近面试被问到了一个问题,笔者当时就懵了:什么XMPP,平时怎么使用,使用过程中遇到什么问题?. 但是还是通过记忆,简单的说了一下自己所知道了,不过那并没有撒卵用,所以你懂的 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开发. 1.关于连接的 1 //此方法在stream开始连接服务器的时候调用 2 - (void)xmppS

iOS开发项目实战——Swift实现图片轮播与浏览

最近开始开发一个新的iOS应用,自己决定使用Swift,进行了几天之后,发现了一个很严峻的问题,那就是不管是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是找到Swift的资源,一看,大概是半年前的代码,或是一年前的代码,一运行,全都报错.这是由于毕竟Swift还是在不断发展完善当中,随着Swift2.0的开源以来,包括发布Swift这一年多以来,Swift的改动还是很大的,很多的接口或是语法前后有较大差异.有些功能只能自己硬生生看官方文档或挤破脑子想,

iOS开发项目实战——Swift实现ScrollView滚动条功能

手机作为一个小屏设备,需要显示的信息往往无法在一个屏幕上显示,此时就需要使用到滚动条,当然除了像TableView这样可以自带滚动功能的.如果一个界面上View较多,那就必须要使用到ScrollView了.现在我们将会使用Swift在iOS上实现滚动效果.具体实现如下: (1)创建一个新的iOS项目,语言选择Swift,并在Main.storyboard中拖入一个ScrollView控件.然后在ScrollView中拖入几张照片,等下可以使用滚动功能查看照片,界面如下: . (2)把Scroll

iOS开发——项目实战Swift篇&swift 2.0项目开发总结二(开发常用)

swift 2.0项目开发总结二(开发常用) 一:相册中选择相片到App指定位置 随 着相机像素的提高,实际用户选择的图片都是很大的,有的高达5.6M,如果直接使用用户选着的图片,非常消耗内存,并且也用不到这么高像素的图片,可以当 用户选着好图片后,在UIImagePickerController对应的代理方法中,先将图片进行重新绘制为需要的大小,在设置给iconView 1 /// MARK: 摄像机和相册的操作和代理方法 2 extension MeViewController: UIIma

iOS开发——项目实战Swift篇&swift 2.0项目开发总结一(开发常用)

swift 2.0项目开发总结一(开发常用) 一:新特性(版本判断)的实现 1 let versionStr = "CFBundleShortVersionString" 2 let cureentVersion = NSBundle.mainBundle().infoDictionary![versionStr] as! String 3 let oldVersion = (NSUserDefaults.standardUserDefaults().objectForKey(vers

iOS开发——项目实战总结&性能优化总结一

性能优化总结一 iOS应用是非常注重用户体验的,不光是要求界面设计合理美观,也要求各种UI的反应灵敏,我相信大家对那种一拖就卡卡卡的 TableView 应用没什么好印象.还记得12306么,那个速度,相信大家都受不了.为了提高 iOS 的运行速度,下面我将抛砖引玉介绍一些我实践过的用来提供iOS程序运行效率的方法,与大家分享,希望能得到更多的反馈和建议. 1,计算代码运行时间:相信数据,不要太相信感觉.不过要注意模拟器和真机的差异. 最简单的工具就是 NSDate,但精度不是太好. 1 NSD

iOS开发——项目实战总结&UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

iOS开发——项目实战总结&类微信朋友圈发动态功能初步-图片与视频上传

类微信朋友圈发动态功能初步-图片与视频上传 最近在做一个新的项目,涉及到了关于图片和视频上传和显示的功能,研究了一段时间,总结一下. 使用AFNetworking上传图片(可一次上传多张图片,包含不同类型png, jpeg)和视频 1 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 2 3 AFHTTPRequestOperation *operation = [manager P

iOS开发——项目实战总结&经典错误一

经典错误一 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s是应用在iPhone 5 A6 的架构上的 解决的方式: 1,在Project target里“Architectures”设置为“Standard (armv7,armv7s)” 2,修改在Project target里“Build Settings”的“Valid Architectures”添