在使用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 忽略注释不规范的警告
全局禁用警告
- code will never be executed
-Wno-unreachable-code 全局禁用警告
-Wunreachable-code 全局启用警告
- Unused Entity Issue / unused function 'xxxxx'
-Wno-unused-function 全局禁用
-Wunused-function 全局启用
附录
IPHONEOS_DEPLOYMENT_TARGET is set to 8.0, but the range of supported deployment
warning: Skipping duplicate build file in Compile Sources build phase: 在 project-targets-选中 target-Build Phases-Compile Sources 中删除重复的类
xcode中如何抑制告警 Double-quoted include in framework header, expected angle-bracketed instead
解决方案
:先从左侧project 栏选中项目,然后进入到 Build Settings ,然后找到Quoted Include In Framework Header
,然后选No
使用 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);
Pointer is missing a nullability type specifier
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_ENDBuilding for iOS, but the linked and embedded framework '.framework' was built for iOS + iOS Simu...
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];
- Empty paragraph passed to '@param' command
其实原因就是注释不合苹果的要求,所以,出现了新的警告,要么修改这些警告为要求的格式,要么全局隐藏这些警告。
如何全局消除这些警告呢?
如下:在Other Warning Flags 里面添加-Wno-documentation
- This block declaration is not a prototype
typedef void(^transactionBlock)();
()
里没有填写void
,在xcode9
之后中会提示一个警告
typedef void(^transactionBlock)(void);
但是这样,很多第三方要改,涉及的面太大了,目前可能不太适合,虽然这个是趋势.
或者,如果只是很少的地方,也可以使用彻底的暂时解决所有这种警告的方式
在工程的设置中
strict-prototypes
设置为NO
,则这些警告就消失了
- Block implicitly retains 'self'; explicitly mention 'self' to indicate this..
其中的意思是block
中使用了self
的实例变量_xxx
,因此block
会隐式的retain
住self
。Xcode认为这可能会给开发者造成困惑,或者因此而因袭循环引用,所以警告我们要显示的在block
中使用self
,以达到block
显示retain
住self
的目的。
方案一:
按照Xcode提示,改成self->_xxx
方案二:
Building Settings->CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF 设置为NO
- iOS 开发去除 CocoaPods 警告
Fix Xcode Warning
因为从 Xcode8.0 开始,引入了文档注释的警告 。
点击查看更多警告处理