What's New in LLVM(2017)

2018/6/10 posted in  iOS

Xcode 9中的Apple LLVM编译器具有新的语言特性、改进的诊断和更强大的优化。了解Objective-C和c++的最新添加,了解新的和改进的警告和静态分析器检查,了解LLVM编译器技术如何为应用程序提供更快的构建时间和更好的运行时性能。

1.不同语言的api检查

@available(iOS 11,*)--oc
#available  --swift

便捷的方法检查(检查可用性,如果你要给某个新的系统加入新功能)

@interface MyAblumController : UIViewController

-(void)showFaces API_AVALABILITY(ios(11.0));

@end

还可以移动整个类的范围

API_AVALABILITY(ios(11.0))
@interface MyAblumController : UIViewController

-(void)showFaces ;

@end

2.不要把Number元素和标量进行比较

@property NSNumber * photoCount;
-(BOOL)hasPhotos{
return self.photoCount > 0
}

因为这个比较相当于是把photoCount和指针nil相比,返回为YES,所以这个错误很严重。

屏幕快照 2018-12-12 下午4.26.59

编译器会报错,提醒你出现了问题,你可以把NSNumber转成interger之后再做判断。

屏幕快照 2018-12-12 下午4.28.18

Control Check in Build Setting

设置Suspicious Conversions 为YES(aggressive)当编译器不确定的时候会弹出如上提示。
屏幕快照 2018-12-12 下午5.06.22

3. copy修饰NSMutableArray

赋值的时候等于是复制了一个不可变对象,所以以后运行时的时候会报错(如果你对这个数组进行修改)

屏幕快照 2018-12-12 下午6.45.36

这个时候就会报错,因为给self.titieArr赋值之后变成了不可变的,所以接下来的操作会导致错误。

解决方法:
//添加setter方法
-(void)setTitleArr:(NSMutableArray *)titleArr{
    
    self.titleArr= [titleArr mutableCopy];
}

每次赋值的时候给数组赋值可变对象。

另外为了及时发现bug可以开启每次build的时候analyze而不是每次都要去手动analyze(如果不开启的话上面的错误不会提示)

屏幕快照 2018-12-12 下午6.48.45
设置Analyze During Build 的值为Yes.

屏幕快照 2018-12-12 下午6.43.05

4. 声明无参数的函数

Non-prototype declarations in C and Objective-C

非原型声明

屏幕快照 2018-12-13 下午3.47.06

在C和OC中意味着foo可以跟任何参数调用,这个行为可以追溯到1977年C语言,不匹配类型的调用会导致运行时的崩溃。
在Xcode9 中编译器带有一个新的警告加强严格原型,会报出警告。

屏幕快照 2018-12-13 下午3.50.45

通常只需要在括号中添加void表示不接收任何参数传递。

屏幕快照 2018-12-13 下午3.51.41

任何带有参数的调用都会直接报错。

另外block中不接收参数的时候也会出现同样的警告,如下所示。

屏幕快照 2018-12-13 下午3.52.47

屏幕快照 2018-12-13 下午3.53.57

升级验证警告设置

屏幕快照 2018-12-13 下午4.08.45

勾选Yes(Error)

Strict Prototypes 勾选Yes(Error)之前 and 勾选之后

Artboard 2@2x

勾选之后就不只是警告了,直接是错误提醒,让你开发的时候不得不注意,也是为了代码的安全性。

结尾

WWDC2017剩余部分是关于C++的优化,如果感兴趣的话可以移步开发者网站观看。