美文网首页SwiftBlog
存储安全:确保变量先定义再使用

存储安全:确保变量先定义再使用

作者: 南栀倾寒 | 来源:发表于2015-06-03 11:15 被阅读558次

写在开头 iOS开发者 群173499350 给大家提供一个交流技术 也可以聊天打屁的平台

翻译自Swift官方Blog

  • 我们在用swift设计开发时的一个重点就是 如何提高编码模型的内存安全问题 本文讲解了一个内存安全的问题 :
    如何确保变量有一个初始值才能使用。
  • swift版简介

变量什么时候是安全的 ? 开发者认为无论任何时候访问一个变量时 都有一个值 而不是nil 像其他编程语言 比如C 要求程序员对内存模型的编程技术非常严格 但是这是有风险的 人总会犯错C++OC用了其他方式改善这种可能造成错误的地方 如OC [nil message]会被忽视 有的语言要求更严格 不赋值 就无法编译
目前解决这种办法采用的技术是让编译器执行数据流分析 如果变量不初始化无法编译通过 像java C# 都采用这种技术 Definitive Initialization

                  注意Swift不仅仅使用这一项技术
  • 初始化一个局部变量
    类型推断允许你这样写

    var myInstance : MyClass  // 定义一个非可选的局部变量
    
    if x > 42 {
    myInstance = MyClass(intValue: 13)
    } else {
      myInstance = MyClass(floatValue: 92.3)
      }
    
    // myInstance已经初始化 所以在下面可以使用
         myInstance.printIt()
    

这里很简单的可以确定变量已经初始化 可以保证不会访问那些未初始化的内存 避免Crash 但是有时候流程可能更加复杂

    var myInstance : MyClass

    if x > 10 {
    myInstance = MyClass(intValue: 13)
   }
    // ...其他操作
   if x > 42 {
   myInstance.printIt()
   }

这时编译器可能告诉你 “Variable myInstance used before initialized” on the call to printIt()其实就是说变量未初始化 编译器不可能做所有预测 或者类型推断 这就要求我们不要写这么复杂的逻辑 去初始化一个变量

在普通数据类型如int 初始化时可以直接这样
var index = 0
但是其他情况可能就要用到init()

  • 其他技术补充

鉴于C语言的兼容性 有时候我们需要使用一些C不安全的API 如UnsafePointer 这样的代码会造成程序运行时Crash 这就要求程序员永远不犯错

  • 隐式初始化

有些编程语言会有一些默认值 比如声明一个变量 int a未给这个变量赋值的情况下 我们就给一个默认值 r如0 但是Swift 没有采用这种考虑 原因如下

  1. 如果有些Protocol没有要求实现init()方法 这样一个变量就可能引用一个未初始化的对象 遗留在Cocoa编程中 这种情况太常见了

  2. 就算不给变量默认值 自己写一个也并不麻烦 而且会提前发现很多错误 使代码更容易维护

注意 只有可选类型或者隐式可选默认值才是nil

 所以Swift采用了 访问一个变量前必须初始化

参考

相关文章

  • 存储安全:确保变量先定义再使用

    写在开头 iOS开发者 群173499350 给大家提供一个交流技术 也可以聊天打屁的平台 翻译自Swift官方B...

  • C语言中的变量

    变量名是用户定义的指向计算机中某个存储空间的标识。变量需先定义后使用。变量先定义后使用的好处: 变量定义后,每个变...

  • 学习计算机之路(C语言篇3)数据类型

    程序中使用的各种变量都要先加以定义,既先定义后使用,对变量的定义可以包括3个方面 ➽ 数据类型 ➽ 存储类型 ➽ ...

  • swift基本语法

    YES 2014WWDC发布 常量和变量使用注意 在实际过程中,建议先定义常量,如果需要修改再改变为变量(更加安全...

  • 六、javascript变量、数据类型及数据类型转换

    1.变量 变量用于存储数据值,在JavaScript中,使用关键字var来定义变量,使用等号来为变量赋值 定义变量...

  • Swift 2、swift 常量&变量

    使用注意: 1. 建议先定义常量,如果需要修改再修改为变量(更加安全) 2.指向的对象不可以在进行修改,可以通过指...

  • 12-Shell脚本_练习

    变量 : 使用变量时, 必须在变量名前加$ 用户自定义变量 :没有数据类型和存储类型直接定义使用, 在定义时必须赋...

  • 2017.9.24--C语言入门

    变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前必须先定义变量...

  • pv pvc学习笔记

    不使用pv/pvc 直接挂载存储 以Azure File存储举例,先定义访问的用户名/密码 再挂载资源 应用: 这...

  • Go语言常量和变量

    变量 Go语言变量的定义 定义变量的格式(先定义再初始化)var 数据名称 数据类型数据名称 = 值; 定义变量的...

网友评论

    本文标题:存储安全:确保变量先定义再使用

    本文链接:https://www.haomeiwen.com/subject/ejsdqttx.html