值类型

作者: 幸运者_Lucky | 来源:发表于2022-03-04 17:26 被阅读0次
struct A {
    var a = 10
}

struct B {
    var a = A() {
        didSet {
            print(1, a.a)
        }
    }
    
    var aa = A() {
        didSet {
            print(11, aa.a)
        }
    }
    
    mutating func set(a: Int) {
        self.a.a = a
        set(aa: a)
    }
    
    mutating func set(aa: Int) {
        self.aa.a = aa
    }
}

struct C {
    var b = B() {
        didSet {
            print("didSet")
        }
    }
    
    mutating func set(a: Int) {
        b.set(a: a)
    }
}

var c = C()
c.set(a: 11)

// 打印顺序
// 1 11
// 11 11
// didSet

看这段代码,理解值类型的实现。

struct Thing {
    var property: Int = 0
}

var optionalThing: Thing? {
    didSet { print("didSet") }
}

optionalThing?.property = 1
// 打印
// didSet
struct A { 
    var foo: Int { 
        didSet { print("fooDidSet") } // not called
    }
}

var a: A? {
    didSet { print("didSet") } // called
}

a?.foo = 5

看上面两段代码,理解可选链断开的时机,也可能是 Swift 的 Bug。

值类型 malloc: Double free of object

class SS {}
struct Store {
    var a = 0
    var k = SS()
}

func test() {
    var store = Store()
    DispatchQueue.concurrentPerform(iterations: 1_000_000) { i in
        store = Store()
    }
}

上面这段代码,会报 malloc: Double free of object 0x1007d22a0,当把 SS 改成 struct,就不会挂掉。值类型在存在堆内存维护的情况下,会出现对引用类型的重复释放问题。wwdc

String 关于触发引用类型

func test() {
    var store = ""
    DispatchQueue.concurrentPerform(iterations: 1_000_000) { i in
        store = "\(1111):\(1111):\(1111):\(1111)"
    }
}

当 store = "(1111):(1111):(1111)" 的时候不会挂掉,但当是上面的代码就会挂掉,触发发了引用类型。

func test() {
    var store = ""
    DispatchQueue.concurrentPerform(iterations: 1_000_000) { i in
        store = "alsdfjlakjsdfaklsjdflakjsdfolakjsdflkajsdfklajsdlkfjasldkfja"
    }
}

上面这段代码没挂掉,因为字符串常量存放在固定的常量区。

综上,Swift String Key 的使用,尽量使用无引用类型 struct 来代替,因为不会触发引用类型。

Property observers being called on a nil struct instance upon attempt to mutate a member property
Bug or intended? “thing?.property = something” will trigger didSet observer even if thing is nil, but ONLY IF thing is a struct type

https://forums.swift.org/t/understanding-swifts-value-type-thread-safety/41406

相关文章

  • 慕课网《前端JavaScript基础面试技巧》学习笔记

    变量类型 值类型和引用类型 值类型只能存储一个值 值类型复制就是值类型本身 引用类型复制只是复制引用类型的指针 引...

  • javascript复习笔记一(变量类型与计算)

    变量类型:分为值类型与引用类型 一、值类型与引用类型 值类型:存储的是具体的值(undefined、Boolean...

  • 值类型与引用类型详解

    值类型包括:基本值类型,结构值类型,枚举值类型。 在C#中,继承自System.ValueType的类型被称为值类...

  • C# 值类型与引用类型

    C# 值类型与引用类型 值类型 值类型的变量直接存储数据。 值类型:byte,sbyte,short,ushort...

  • 一.C#中值类型与引用类型

    总结:值类型直接存储其值,引用类型存储对值的引用,值类型存在堆栈上,引用类型存储在托管堆上,值类型转为引用类型叫做...

  • JS 作用域及变量值的引用

    基本类型和引用类型的值 JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型值源自...

  • 面试

    值类型和引用类型 值类型和引用类型的区别是值类型直接存储其值,而引用类型存储对值的引用。这两种类型存储在内存的不同...

  • JS基础知识 (一)--变量类型和计算

    变量类型 js变量类型分为基本类型(或者叫值类型)和引用类型。(按照存储方式区分)• 值类型值类型:Number、...

  • 基本类型值和引用类型值

    JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。 *引用类型包括: 基本类型值和引用类型...

  • 使用引用类型为没有使用基本类型

    成员变量的类型使用引用类型,基础类型会为空值付默认值。引用类型空值就是空值。

网友评论

      本文标题:值类型

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