iOS警告处理

1. Xcode8之后遇到的一个很频繁的问题,头文件中 Pointer is missing a nullability type specifier(_Nonnull,_Nullable,or _Null_unspecified)

解决方法:头文件中加入NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END
@interface CustomInstance : NSObject
NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSString *name;
NS_ASSUME_NONNULL_END
@end

2. Auto property synthesis will not synthesize property ‘delegate’; it will be implemented by its superclass, use @dynamic to acknowledge intention

解决方法:在子类中显式的声明一个@synthesize name = _name;

3. NSAssert的解析

之前就遇到过工程改成release时,发现发生了一些莫名其妙的问题,追查了很久才发现这个问题,希望能帮助到各位。
默认情况下NSAssert是禁用的。在debug情况下,所有NSAssert都会被执行。在release下不希望NSAssert被执行,我们通常在release种将断言设置成禁用。
设置方法:在targets种选择build,选择release。在gcc preprocessing下增加Preprocessor Macros 值为 NS_BLOCK_ASSERTIONS 和 NDEBUG.

4. 直接消除警告

如果警告是自己的代码导致的可以直接修改,但是如果是第三方库的是不是就改起来不那么爽了呢。这时候就可以直接粗暴的消除警告就好了。
首先点击这个警告,右键->reveal in log就能看到警告的详细描述,就能看到[]里面的字符就是警告对应的标识符。
比如 Implicit conversion loses integer precision: ‘NSInteger’ (aka ‘long’) to ‘int32_t’ (aka ‘int’) 警告 显示的就是 -Wno-shorten-64-to-32。其中 -W是前缀,这个前缀表示的是 打开这种类型的警告 如果我们是要关闭某种类型的警告的话, 要将 -W换成 -Wno- ,也就是 -Wno-shorten-64-to-32。如果整个项目都不想显示这个警告,就可以在Build Setting里加上这个标示符,Build Setting里搜索Other Warning Flags里添加关闭警告的命令。如果只是针对某个文件不想显示这个警告,则可以Build Phases->Compile Sources下找到相应的文件在Compiler Flags下面加上命令即可。如果只是针对一段代码不显示某个警告,可以加上如下代码

#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wunused-variable"

//这里是会报警告的代码

#pragma clang diagnostic pop

如果不想显示通过cocoapod导入的第三方库的警告,则可以直接在Podfile文件里加入inhibit_all_warnings!,加在platform下面就可以。

5. 科学正确的消除警告

上面的方法其实主要是针对第三方的代码而言的,自己码的代码出现的警告还是需要按照提示去改正它,尽量保证自己的代码零警告。我感觉一般情况下这真的不是一件难事。
下面列出一些最常见的一些警告和解决方法,大神请跳过:
(1) 类似’sizeWithFont:constrainedToSize:lineBreakMode:’ is deprecated: first deprecated in iOS 7.0 - Use -boundingRectWithSize:options:attributes:context:这种错误就是方法被废弃了,按照提示去学习一下新的方法来替换掉就OK了,虽然弃用不会报错,还是可以正常使用。但是本人觉得如果新的方法可以代替原方法功能的前提下还是尽快处理掉比较好,不要一直等到旧的方法真的被删除了再去解决崩溃。
(2)’strongify’ macro redefined
宏被重复定义了,删掉一个就好了。
(3)Code will never be executed
很明显写了一个从来没被调用的方法,及时删除不需要的代码是一个很好的习惯,不然越写代码越多,随着时间的逝去,你是不是会觉得我也不知道我这代码到底有没有用了呢
(4)Format specifies type ‘unsigned long’ but the argument has type ‘unsigned int’
这个在NSLog时应该是一个非常常见的警告,可以根据提示去转成相应的类型,也可以直接用NSLog(@”%@”,@(intValue));这种方式去解决。
(5)Method ‘addNumber’ in protocol ‘MyDelegate’ not implemented
遵守了协议,但是没有去实现这个协议的方法。如果你不需要每个遵守这个协议的类去实现这个方法,就在这个方法上面加@optional标记,如果不加则默认为@required,就是必须要实现这个方法。
(6)Attribute Unavailable: Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
表示这个方法必须要在iOS 8.0之后才可以用,如果运行在之前版本会崩溃,如果你的APP可以要求最低运行版本是8.0就设置成最低版本为8.0,如果还是要运行在8.0以下则在执行代码前判断当前系统版本如果大于8.0再去执行,否则用之前的方法来实现这个功能。

我只是列出了几种常见的警告,欢迎大家在评论区留言添加更多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值