代码之家  ›  专栏  ›  技术社区  ›  mfaani

如何在Swift中演示僵尸对象?

  •  0
  • mfaani  · 技术社区  · 6 年前

    我读过 How to demonstrate memory leak and zombie objects in Xcode Instruments? 但那是目标c。这些步骤不适用。

    here 我知道僵尸是指:

    • 解除分配
    • 但指针仍然试图指向他们并向他们发送消息。

    不确定这与访问释放的对象有什么不同。

    我的意思是在斯威夫特你可以做到:

    var person : Person? = Person(name: "John")
    person = nil
    print(person!.name)
    

    我们是想指出它吗?对!

    2 回复  |  直到 6 年前
        1
  •  3
  •   Rob Napier    6 年前

    这不是悬空指针或僵尸。当你使用 ! 你是说“如果这是零,那么崩溃。”你不应该想到 person 作为斯威夫特的指针。这是一个价值观。该值可能是 .some(T) .none (也称为 nil ). 这两个都不是悬空的。它们只是两个不同的显式值。斯威夫特的 与其他语言中的空指针完全不同。它只会在您显式请求时像空指针一样崩溃。

    Unmanaged . 这在斯威夫特极为罕见。

        2
  •  4
  •   Cristik    6 年前

    class Parent { }
    
    class Child {
        unowned var parent: Parent // every child needs a parent
    
        init(parent: Parent) {
            self.parent = parent
        }
    }
    
    var parent: Parent? = Parent()
    let child = Child(parent: parent!) // let's pretend the forced unwrap didn't happen
    parent = nil // let's deallocate this bad parent
    print(child.parent) // BOOM!!!, crash
    

    在这段代码中发生的是 Child Parent ,一旦失效 起源

    致命错误:尝试读取无主引用,但对象0x1018362d0已解除分配2018-10-29 20:18:39.423114+0200 MyApp[35825:611433]致命错误:尝试读取无主引用,但对象0x1018362d0已解除分配

    注意 这个代码在操场上不起作用,你需要一个常规的应用程序。