最新版本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()) ,就不用再方法里面做系统版本判断了,错用会有警告提示。

例如:

(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/

iOS 11 Xcode9开发 新特性学习 (警告篇)的更多相关文章

  1. iOS 11 Xcode9开发 新特性学习 (新方法篇)

    1 .  引入github (1) 在Xcode 9 中,引入了 gitHub,新源代码管理导航器 可以展示branch分支和 tag标签. (2)点进去,就可以看指定一次commit了哪些东西 2 ...

  2. (数据科学学习手札139)geopandas 0.11版本重要新特性一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...

  3. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  4. 使用Git分支开发新特性或修复Bug与使用Git分支开发新特性或修复Bug

    使用Git分支开发新特性或修复Bug 通过分支,可以在不影响原有代码的前提下改变代码,主要用于开发新功能新特性.下 一代产品 为已经发布的正式版修复bug 团队开发时为每个人建立一个分支,从而避免相互 ...

  5. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  6. iOS开发——新特性OC篇&IOS9 SDK新特性

    iOS9 SDK新特性 WWDC 2015苹果开发者大会是移动开发者一年一度的盛会,InfoQ中文站除了第一时间整理Keynote内容分享给大家之外,还邀请了资深的一线开发者分享他们的收获.本文为王巍 ...

  7. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  8. iOS开发——新特性OC篇&IOS9 系统新特性

    IOS9 系统新特性 2015年6月89号凌晨召开的WWDC 2015苹果开发者大会发布了全新的iOS 9系统,PC6小编今天给大家整理了这次iOS9的系统更新带来了哪些新的功能与升级,本次新功能一览 ...

  9. iOS开发——新特性OC篇&Objective新特性

    Objective新特性 Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时, ...

随机推荐

  1. ext2文件系统了解

    一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下以ext2文件系统为例说明文件 ...

  2. 模式识别 - libsvm的函数调用方法 具体解释

    libsvm的函数调用方法 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM的 ...

  3. UML结构体系简介

    一.UML的结构 UML有3种基本的构造块,分别是事物(元素).关系和图.事物是UML中重要的组成部分.关系把事物紧密联系在一起.图是很多有相互相关的事物的组. 二.UML的事物 UML中的事物也称为 ...

  4. python django -2 ORM模型

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  5. Google Careers 程序员必修课

    quote from : https://www.google.com/about/careers/students/guide-to-technical-development.html Techn ...

  6. PHP中foreach详细解读

    oreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息.有两种语法: foreach (array_ ...

  7. linux 学习笔记1

    1.IDE硬盘        /dev/hd[a-d]                   IDE1  主  /dev/hda   从 /dev/hdb          IDE2        主 ...

  8. VMware Workstation网卡不启动

    故障原因:虚拟机安装完成后,默认网络配置为”NAT”,对应真机的系统服务为“VMware NAT Service”默认情况下该服务启动类型为自动,状态为启动,若该服务未能正常启动则会导致如上报错,手动 ...

  9. Python踩坑:类与类对象类型参数传递与使用

    前言 对初学者来说,Python确实简单好用,毕竟动态类型语言,不用定义就可以拿来用,类型之间随意转换简直不要太方便,因此Python用来写写小脚本,爬虫程序什么的,没什么问题. 不过,一旦用来开发稍 ...

  10. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...