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

时间:2023-03-09 08:56:31
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 去做判断。参考代码:

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

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

例如:

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

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

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

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

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

__builtin_available 去判断

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

对类的约束:

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

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

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

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

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

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

2 .   analyze

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

(1)错误类型比大小

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

(2) analyze 提示出错

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

(3)修正错误

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

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

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

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

(1)只能有一个实例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

潜在问题。

3 .

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

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

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

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

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

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

(2)两种解决方案

a.

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

b.

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

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

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

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

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

测试模拟:

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

销毁模拟 :

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

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

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

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

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

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

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

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

改后,如果滥用就报错

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

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

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

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

参考:

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