iOS 中强制去除警告的方法

在使用xcode进行iphone应用开发时,经常需要添加一些第三方的类库,而一些第三方的类库由于缺少维护,从而导致类库中含有各种警告和各种内存泄漏,但并不影响运行.
倘若我们需要用到第三方库,而由不想在代码分析时看到这些库的警告或内存泄漏,我需要这样做:

#pragma clang diagnostic push  
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"  
    //含警告的代码,如下,btn为UIButton类型的指针  
    UIView *view = btn;  
#pragma clang diagnostic pop  

“-Wincompatible-pointer-types”为警告类型

clang为编译器名,这里也可以替换为GCC

#pragma clang diagnostic ignored 后面只能跟一个忽略警告类型
如果需要同时忽略多种警告,需要这样写:

#pragma clang diagnostic push  
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"  
#pragma clang diagnostic ignored "-Wincomplete-implementation"  
    //含警告的代码,如下,btn为UIButton类型的指针  
    UIView *view = btn;  
#pragma clang diagnostic pop  

另外使用xcode的Analyze进行代码分析时,xcode会检查出程序的内存泄漏,这个不属于编译警告,我们需要添加一个宏来把这些代码忽略:

#ifndef __clang_analyzer__  
    //含内存泄漏的代码  
#endif  

iOS 上的开源正则扩展类 RegexKitLite 就是一个充满各种内存泄漏的类,尽管作者已经在该类上注释说可以忽略这些内存泄漏的提示,但作为一个有代码洁癖的程序员,我还是不想看到这些内存泄漏的警告提示.

//已知的一些编译警告类型  
-Wincompatible-pointer-types 指针类型不匹配  
-Wincomplete-implementation 没有实现已声明的方法  
-Wprotocol 没有实现协议的方法  
-Wimplicit-function-declaration 尚未声明的函数(通常指c函数)  
-Warc-performSelector-leaks 使用performSelector可能会出现泄漏
-Wdeprecated-declarations 使用了不推荐使用的方法(如[UILabel setFont:(UIFont*)])  
-Wunused-variable 含有没有被使用的变量  
-Wno-documentation 忽略注释不规范的警告

全局禁用警告

image.png
  1. code will never be executed
-Wno-unreachable-code   全局禁用警告
-Wunreachable-code      全局启用警告
  1. Unused Entity Issue / unused function 'xxxxx'
-Wno-unused-function    全局禁用
-Wunused-function       全局启用

附录

  1. IPHONEOS_DEPLOYMENT_TARGET is set to 8.0, but the range of supported deployment

  2. warning: Skipping duplicate build file in Compile Sources build phase: 在 project-targets-选中 target-Build Phases-Compile Sources 中删除重复的类

  3. xcode中如何抑制告警 Double-quoted include in framework header, expected angle-bracketed instead
    解决方案:先从左侧project 栏选中项目,然后进入到 Build Settings ,然后找到 Quoted Include In Framework Header,然后选 No

  4. 使用 os_unfair_lock 替换掉 OSSpinLock

#import <os/lock.h>
@interface ClassName () {
    os_unfair_lock _spinLock;
}
_spinLock = OS_UNFAIR_LOCK_INIT;
os_unfair_lock_lock(&_spinLock);
os_unfair_lock_unlock(&_spinLock);
  1. Pointer is missing a nullability type specifier
    NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END

  2. Building for iOS, but the linked and embedded framework '.framework' was built for iOS + iOS Simu...

  3. NSKeyedUnarchiver变更

// 存档
data = [NSKeyedArchiver archivedDataWithRootObject:object requiringSecureCoding:YES error:nil];
// 解档
object = [NSKeyedUnarchiver unarchivedObjectOfClasses:[NSSet setWithArray:@[NSArray.class,NSDictionary.class, NSString.class, NSMutableArray.class, NSMutableDictionary.class, NSMutableString.class, NSMutableData.class, NSData.class, NSNull.class, NSValue.class,NSDate.class]] fromData:item.value error:nil];

  1. Empty paragraph passed to '@param' command

其实原因就是注释不合苹果的要求,所以,出现了新的警告,要么修改这些警告为要求的格式,要么全局隐藏这些警告。

如何全局消除这些警告呢?
如下:在Other Warning Flags 里面添加-Wno-documentation

  1. This block declaration is not a prototype
typedef void(^transactionBlock)(); 

()里没有填写void,在xcode9之后中会提示一个警告

typedef void(^transactionBlock)(void);

但是这样,很多第三方要改,涉及的面太大了,目前可能不太适合,虽然这个是趋势.
或者,如果只是很少的地方,也可以使用彻底的暂时解决所有这种警告的方式
在工程的设置中
strict-prototypes设置为NO,则这些警告就消失了

  1. Block implicitly retains 'self'; explicitly mention 'self' to indicate this..

其中的意思是block中使用了self的实例变量_xxx ,因此block会隐式的retainself。Xcode认为这可能会给开发者造成困惑,或者因此而因袭循环引用,所以警告我们要显示的在block中使用self,以达到block显示retainself的目的。

方案一:
  按照Xcode提示,改成self->_xxx
方案二:
   Building Settings->CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF 设置为NO
  1. iOS 开发去除 CocoaPods 警告
    Fix Xcode Warning

因为从 Xcode8.0 开始,引入了文档注释的警告 。

点击查看更多警告处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,054评论 3 119
  • 一个人走,一个人工作,一个人承受责任,一个人对话,为什么总是一个人?所有的选择都需要我自己面对,难道生活本来就是这...
    敏敏_7dec阅读 1,072评论 0 0
  • 天愈来得黑了 雨愈来得猛了 残叶依旧飘飞 有时风卷的急了 它也倦了,累了,就散了。
    由淘阅读 1,594评论 0 0
  • 远行需要勇气,或许偶尔的冲动会帮你一把,不在熟悉的环境里挣扎着。我不是一个很洒脱的人,即使给我100倍的勇气,我还...
    Du_DDong阅读 1,661评论 0 0

友情链接更多精彩内容