• iOS 自己手动添加编译警告


    文/青花瓷的平方(简书作者)
    原文链接:http://www.jianshu.com/p/b2e30cad2a0d
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    缘由

    上一次生产环境我们出现重大bug,因ApplePay上线,其中有一个宏文件我同事忘记加版本控制,测试也没测试(因为是小版本,applepay还未开放),导致线上一天崩溃近万次,多亏了jspatch,用热修复解决了此问题。那么问题来了,怎么让开发人员提前看到编译警告呢,以至于不犯这种低级错误。

    解决

    1.xcodebuild

    这是我第一眼想到的方法,写shell脚本,用自动编译的形式检测。但是这个有很大的问题:
    (1)Xcode7 现在支持的模拟器sdk是9.2版本,其他sdk需要我们自己在网上下载,一般都是从Xcode老版本中拷出来才行,可用xcodebuild -showsdks 查看支持的sdk,如下图


    201601181.png


    具体的xcodebuild使用介绍网上很多,我就不阐述了,刘伟的一篇文章写得很详细,可参考:xcodebuild 命令详解
    (2)其次是编译其他sdk的时间会很长(如果是大项目的话),写一个脚本编译也没多大优势。

    2.更好的解决方法

    更好的解决方式明显是让编译器直接给出警告!那么如何才能让编译器给出警告呢?


    201601182.png


    上面的图片引用自 Warn about new API Classes and Methods
    对于Xcode中销毁的方法编译器直接给出警告,那么编译器是如何给出这些警告和错误信息的呢?
    具体涉及deprecated,unavailable这些用法,可参考

    [iOSSimulatorSDK] usr/include/Availability.h
    [iOSSimulatorSDK] usr/include/AvailabilityInternal.h

    我在stack overflow上搜到了一篇很受启发的文章:Is there a way for XCode to warn about new API calls?
    其中好几个回答都很好,因此找到了开源项目MJGAvailability,
    我修改了这个头文件,添加了ios7之后的api,但是最终在Xcode7上新建一个项目测试发现始终没有编译警告,但是对自定义标注的属性和方法都有警告,如下图


    201601184.png

    一开始我以为是把UIKit都系统控件是不是放在我自定义头文件之前了,后面过了很长时间才觉得应该Xcode中某些编译配置的问题,最终查到了是Enable Modules 和 Link Framwork automatically的原因,这是Xcode5之后提出的一门技术,具体可参考[iOS7中Objective-C和Foundation的新特性],最终我在Debug模式设置Enable Modules 和 Link Framework automatically为NO(可能会出现编译错误,因为自动连接取消,一些关联的库文件需要自己手动添加)


    201601185.png

    注意:由于我们重定义了系统宏,在release下不应该这样做,因为这样做可能会导致一些无法预知的问题,所以你可以在pch文件添加debug判断

    demo

    具体的demo在我的github上TestApiLevel

  • 相关阅读:
    对我影响最大的三位导师
    global与nonlocal
    random模块
    time模块
    datetime模块
    sys模块
    os模块
    collection模块
    hashlib模块
    pickle模块
  • 原文地址:https://www.cnblogs.com/soulDn/p/5336439.html
Copyright © 2020-2023  润新知