美文网首页
swift的值类型和引用类型

swift的值类型和引用类型

作者: 现在是未来的过去 | 来源:发表于2022-03-15 14:38 被阅读0次

    swift的类型有哪些?

      swift的类型分为值类型和引用类型两种。值类型在传递和赋值时将进行复制,而引用类型只会使用引用对象的于个"指向"。swift中定义的很多类型都是值类型,如struct、enum以及所有的内建类型(Int、Bool、String、Array、Dictionary)都是值类型。class为引用类型。

    为什么使用值类型?

      相对于传统的引用类型来说,值类型的一个显而易见的优点就是减少堆上的内存分配和回收次数。而且swift中的值类型,特别是array和dictionay这种容器,在内存管理上都经过精心设计。值类型的一个特点是在传递和赋值时进行复制,而每次复制必定会产生额外开销,但是在swift中这个消耗会被控制在最小范围内,在没有必要复制的时候,值类型的复制并没有发生。也就是说,简单的赋值和参数的传递等普通操作,就算用不同的名字来回设置和传递值类型,但是在内存上它们都是一样的。比如下面这段代码:

    func test(array: [Int]) {
      for i in array {
          print(i)
      }
    }
    var a = [1, 2, 3]
    var b = a
    var c = b
    test(a)
    

      这段代码直到运行结束,其实只在a数组初始化时发生了内存分配,而之后的b、c甚至传递到test方法中的数组都没有发生内存分配,它们都指向栈上的同一块内存空间。这个过程对于数组来说,只发生了指针移动,完全没有新增堆内存的分配和释放问题,效率上更加高效。前面我们说值类型在赋值和传递时会发生复制,是不是swift中就不复制了呢,我们看下面这段代码:

    var a = [1, 2, 3]
    var b = a
    b.append(4)
    

      当b数组append执行完后,此时值复制就是必须的了,之后将重新为b分配内存,a和b将分属于不同的内存。极大的优化了内存的使用效率。

    什么时候不使用swift内置的array和dictionary,而使用NSMutableArray 和 NSMutableDictionary?

      虽然将数组和字典设计为值类型最大的考虑是为了线程安全,但是这样的设计在存储的元素或条目数量较少时,给我们带来了另一个优点,即非常高效,而"一但赋值就不太会变化"这种使用场景在Cocoa框架中并不少见,这有效的减少了内存的分配和回收。但是在一些少数情况下,数组或字典中存储了很多东西,并且还要对其中的东西进行添加或删除,这时如果依旧使用swift内建的值类型容器就不太适合了,它会在每次操作时都复制一遍,即便存储的都是引用类型,在复制时我们也需要存储大量的引用,这个开销也不容忽视,这个时候最好使用NSMutableArray 和 NSMutableDictionary。
      所以,总结下来使用数组、字典的最佳实践是:根据具体的数据规模和操作特点来决定是使用值类型容器还是引用类型容器:在需要处理大量数据并且频繁操作其中元素时,选择NSMutableArray 和 NSMutableDictionary会更好;而对于容器内条目小而容器本身数目多的情况,则应该使用swift内建的array和dictionary。

    相关文章

      网友评论

          本文标题:swift的值类型和引用类型

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