Ios 如何在Swift中知道结构已从内存中删除?

Ios 如何在Swift中知道结构已从内存中删除?,ios,swift,struct,memory-leaks,automatic-ref-counting,Ios,Swift,Struct,Memory Leaks,Automatic Ref Counting,在swift类中,type具有方法deinit(),在该方法中,我们可以定义类的实例将从内存中删除。对于struct,我们如何知道它将从内存中删除 比如说, struct Vehicle { ... } var v: Vehicle? = Vehicle() v = nil 一种简单的方法是使用虚拟类。只需创建一个空类并在那里实现deinit()。然后在结构中使用这个类作为成员,p.e let dummyClass = DummyClass() 释放结构后,将调用该类的deinit()函数。

在swift类中,type具有方法
deinit()
,在该方法中,我们可以定义类的实例将从内存中删除。对于struct,我们如何知道它将从内存中删除

比如说,

struct Vehicle { ... }
var v: Vehicle? = Vehicle()
v = nil

一种简单的方法是使用虚拟类。只需创建一个空类并在那里实现deinit()。然后在结构中使用这个类作为成员,p.e

let dummyClass = DummyClass()

释放结构后,将调用该类的deinit()函数。如果没有,则表示内存泄漏。

当结构超出作用域时,它们将被解除分配。您不能在结构中放置deinit,但这里有一个解决方法。您可以创建一个结构,该结构具有对类的引用,该类在解除分配时打印某些内容

class DeallocPrinter {
    deinit {
        print("deallocated")
    }
}

struct SomeStruct {
    let printer = DeallocPrinter()
}  

因此,当结构被解除分配时-如果您尚未制作结构的副本,它将在解除分配时打印解除分配,因为解除分配打印机将在解除分配结构的同时被解除分配。

能否添加一些信息,说明您为什么需要这些信息?也许是一个具体的用例?这里有一个可能的方法:(寻找“DealLocalPointer”),但是如果结构已经被复制,那么这就不起作用了,因为值语义另请参见:“结构的deinit实际上不起作用,因为结构一直被复制和销毁。”@LeoDabus:该结构可能包含非内存管理的资源(例如Unix文件描述符)。然而,在这种情况下,最好使用一个类。@MartinR也许从现在起5年后我可以和您讨论:)对于结构,没有
deinit
。但是,
deinit
的实用程序与
class
类型不同。对于类类型,如果将其传递给另一个方法,则不知道该函数是否会保留对该对象的引用,因此实例化该对象的代码实际上无法控制该对象的寿命。在这种环境中,你偶尔需要说“顺便说一下,当你处理完这个对象时,这是对象需要做的清理工作”。值类型没有这些顾虑。
class DeallocPrinter {
    deinit {
        print("deallocated")
    }
}

struct SomeStruct {
    let printer = DeallocPrinter()
}