侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

Swift中值类型和引用类型的区别

2025-12-11 / 0 评论 / 4 阅读

题目

Swift中值类型和引用类型的区别

信息

  • 类型:问答
  • 难度:⭐

考点

值类型,引用类型,内存管理

快速回答

Swift中数据类型分为值类型和引用类型:

  • 值类型:赋值时创建独立副本(如Int、String、Struct)
  • 引用类型:赋值时共享同一实例(如Class)
  • 关键区别:
    • 值类型:修改不影响原始变量
    • 引用类型:修改影响所有引用
## 解析

一、核心区别

Swift中数据类型分为两大类:

  • 值类型(Value Types)
    • 赋值时创建完整独立副本
    • 包含:所有基本类型(Int, Double, Bool)、String、Array、Dictionary、Set、Tuple、Struct、Enum
  • 引用类型(Reference Types)
    • 赋值时共享同一内存实例
    • 包含:Class、Closure、Actor

二、代码示例

// 值类型示例(Struct)
struct Point {
    var x: Int
    var y: Int
}
var p1 = Point(x: 1, y: 2)
var p2 = p1  // 创建独立副本
p2.x = 5
print(p1.x)  // 输出 1(原始值未改变)

// 引用类型示例(Class)
class Person {
    var name: String
    init(name: String) { self.name = name }
}
let person1 = Person(name: "Alice")
let person2 = person1  // 共享同一实例
person2.name = "Bob"
print(person1.name)  // 输出 "Bob"(原始值被修改)

三、内存管理原理

  • 值类型
    • 存储在栈内存(Stack)
    • 赋值时发生深拷贝(deep copy)
    • 线程安全(每个线程操作独立副本)
  • 引用类型
    • 存储在堆内存(Heap)
    • 使用引用计数(ARC)管理内存
    • 赋值时增加引用计数

四、最佳实践

  • 优先选用值类型(尤其Struct):
    • 避免意外的共享状态
    • 线程安全
    • Swift标准库90%以上是值类型
  • 引用类型适用场景:
    • 需要共享状态(如UIViewController)
    • 需要继承(值类型不支持继承)

五、常见错误

  • 误以为Array/Dictionary是引用类型(实际是值类型)
    var arr1 = [1, 2, 3]
    var arr2 = arr1
    arr2.append(4)
    print(arr1) // [1,2,3](未改变)
  • 在值类型内错误使用引用类型
    struct User {
        var settings: NSMutableDictionary // 危险!可能被意外修改
    }

六、扩展知识

  • Copy-on-Write(写时复制)
    • Swift对集合类型的优化机制
    • 仅在修改时创建副本,提升性能
    • 例如:Array赋值时不立即复制,修改时才复制
  • inout参数
    • 函数内可修改值类型参数(类似引用传递)
      func increment(_ num: inout Int) {
          num += 1
      }
      var value = 10
      increment(&value) // value变为11