• iOS 11 Xcode9开发 新特性学习 (警告篇)


    最新版本SDK优化了开发体验,编译过程会提供更多提示警告,建议你修改。这些功能也可以自主选择用或者不用,当然,苹果喜欢你用他推荐的东西。。。

    1 . @avalibale 语法,同步判断当前iOS系统是否满足需求。例如:

     if (@available(iOS 11, *)) { // >= 11
            DLog(@"XXX1");
        } else if (@available(iOS 10, *)) { //>= 10
            DLog(@"XXX2");
        } else { // < 10
            DLog(@"XXX3");
        }   

    (2)声明或者引用一些api需要在指定iOS版本才起作用会有warning,这个时候 可以用1 去做判断。参考代码:

          

    1.2 如果是对方法的声明 添加API_AVAILABLE(ios(11)) ,就不用再方法里面做系统版本判断了,错用会有警告提示。

    例如:

         

     (2)如果在类之前声明 API_AVAILABLE(ios(11)) 就是对该类添加了系统版本约束。

          

         

       (3) 针对runtime 或者 c/c++ 方法中里面,也有对应判断系统版本方法,相似 @avalibale 语法

              __builtin_available 去判断

           

           对类的约束:

           

       (4)苹果鼓励你升级Xcode 使用最新sdk 和操作以上方法,但是也不妨碍回归老版本sdk,这时候@available方法在

          编译时候 ,会被忽略不做警告提示。

               但个人认为,已经做版本判断了的话,还是要注意业务逻辑的。这个功能也是可选的使用下图。当然苹果鼓励你

          操作最新语法 去运用到项目中来。

               

    2 .   analyze

    2.1  使用该分析功能 会帮你提示 类型错误提示。举例参考2.2.1 NSNumber类型和数字类型比大小,这个会出问题 。 当 photoCount没赋值就是nil 会返回 NO, 如果有值 都会返回YES。这可不是一个正常的比大小的逻辑 乱套了,要知道的是 类型使用错误通常的直接反应就是崩溃,这类问题还是很严重的。

        (1)错误类型比大小

        

      (2) analyze 提示出错

        

       (3)修正错误

        

      (4) 这个这个也是选择使用的方法参考下面图片

        

    2.2  声明单利,会遇到的问题

       (1)只能有一个实例

        

       (2)dispatch_once 使用谓词 一定是静态 或者全局来进行必要修饰 。

             

        解决使用错误 给的例 是使用 NSLock 同步锁 。

        

        

        (3)资源竞争造成的死方式锁,数据读取或者存储都不正常

    2.3 不要使用copy 修饰可变类型 比如可变数组可变字典等

        (1) 如下图会出现什么问题??

         

        (2) 用copy修饰可变类型,会导致可变类型 变成普通类型,这样可变数组变成不可变数组了,再动态添加元素,就会崩溃

             因为动态添加元素根本不是 NSArray 里面的方法。。。

         

       (3)analyze 帮助我们提示这种 应该修改的错误

         

         

      (4)还可以选择 在编译过程顺便 analyze这个我真是 之前都是想起来analyze ,现在build 就可以,这样更方便我们查找

        潜在问题。

     3 .

      (1)引用已经释放的对象(野指针 崩溃)会 做提示。 下面代码有什么问题?

         

         分析:enumerateKeysAndObjectsUsingBlock: 循环体相当于一个自动释放内存池,用过即废掉,

         所以外部再引用NSError要展示信息的话 一定会崩溃的发生野指针错误。

         

         

        (2)两种解决方案

          a.

              

          b.

          

          详细解释: 取地址符号的error写法是要渗透到方法里面可以被修改的变量对象。 这就说明,方法对error来说

          就是强引用,如果在方法里被销毁,外边不引用了还好,如果继续引用error就会报野指针错误而崩溃。

          模拟销毁不是在方法内置error为nil而是放到自动释放内存池里面,自己也可以模拟出这种情况。这就进一步验证了

          关于字典的快速遍历的循环体是即时销毁的。因此,如果需要继续使用error一定要处理成强引用写法。

          测试模拟:

         

         销毁模拟 :

         

         (3) 举例说类似C语言,如果声明方法不指定类型虽然可以编译通过,但是现在可以报警告,防止未来不明确调用

           会出问题:“not type safe” 类型不安全。

         

        改了警告说的 类型不安全问题,滥用错误引用就会报错:

        

      (4)同理:闭包函数也是一样的:

        

        改后,如果滥用就报错

        

       (5)这个也是在build时候检查, 也可以选择使用该项检查,参考配置

         

    4 . C++ 的开发体验 优化与支持 略 (目前还没这个经验。。。)

        

      参考:

      (1)https://developer.apple.com/videos/play/wwdc2017/411/

           

  • 相关阅读:
    闭包函数与装饰器
    python 函数的参数
    python 函数定义及调用
    python 文件指针及文件覆盖
    phtnon 文件操作
    Volatile 关键字 内存可见性
    UNION 和 UNION ALL 操作符
    设计模式(七)---- 模板方法模式
    设计模式(六)---- 策略模式
    设计模式(五)---- 原型模式
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/7089134.html
Copyright © 2020-2023  润新知