gpt4 book ai didi

swift - 在 Swift 中删除一个类的实例

转载 作者:行者123 更新时间:2023-12-02 14:58:39 27 4
gpt4 key购买 nike

如何在 Swift 中删除一个类的实例?寻找某种等同于

del instance

在 Python 中。我是 Swift 的新手,我在文档或任何以前的帖子中找不到任何内容。

我在游戏中有一个子弹类,在与玩家发生碰撞后需要将其删除。示例代码可以是这样的

class Bullet() {
init() {
for traveled in 0...range {
//travel forward
if collided {
//damage collided player
del self
}
}

编辑:这就是为我解决问题的原因 http://www.apeth.com/iOSBook/ch12.html#_memory_management

最佳答案

如另一个问题中所述,Swift 使用 Automatic Reference Counting .

Apple 是这样解释的:

ARC tracks how many properties, constants, and variables are currently referring to each class instance. ARC will not deallocate an instance as long as at least one active reference to that instance still exists.


ARC 实战

这是自动引用计数工作原理的示例。此示例从一个名为 Person 的简单类开始,该类定义了一个名为 name 的存储常量属性:

class Person {
let name: String

init(name: String) {
self.name = name
print("\(name) is being initialized")
}

deinit {
print("\(name) is being deinitialized")
}
}

Person 类有一个初始化程序,它设置实例的 name 属性并打印一条消息以指示初始化正在进行。 Person 类还有一个析构器,它会在释放类的实例时打印一条消息。

下一个代码片段定义了三个 Person? 类型的变量,用于在后续代码片段中设置对新 Person 实例的多个引用。因为这些变量是可选类型(Person?,而不是 Person),所以它们会自动初始化为 nil 的值,并且不会当前引用一个 Person 实例。

var reference1: Person?
var reference2: Person?
var reference3: Person?

您现在可以创建一个新的 Person 实例并将其分配给以下三个变量之一:

reference1 = Person(name: "John Appleseed")
// Prints "John Appleseed is being initialized"

请注意,消息 “John Appleseed is being initialized” 是在您调用 Person 类的初始化程序时打印的。这确认初始化已经发生。

因为新的 Person 实例已分配给 reference1 变量,所以现在有一个从 reference1 到新的 的强引用>Person 实例。因为至少有一个强引用,ARC 确保此 Person 保留在内存中并且不会被释放。

如果您将相同的 Person 实例分配给另外两个变量,则会建立对该实例的两个更强的引用:

reference2 = reference1
reference3 = reference1

现在有对这个单个 Person 实例的三个强引用。

如果您通过将 nil 分配给两个变量来破坏这些强引用中的两个(包括原始引用),则将保留一个强引用,并且 Person 实例未被释放:

reference1 = nil
reference2 = nil

ARC 不会释放 Person 实例,直到第三个也是最后一个强引用被破坏,此时很明显您不再使用 Person 实例:

reference3 = nil
// Prints "John Appleseed is being deinitialized"

ARC in Action 的所有代码和写作均来自 Apple's documentation .

关于swift - 在 Swift 中删除一个类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51582916/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com