如何在Swift中调用deinit函数

19

我写了以下的代码块:

class Person{
        let name:String;
        init(name:String){
         self.name = name;
          println("\(name) is being initialized.");
     }

     deinit{
         println("\(name) is being deInitialized.");

    }
 }

var person:Person?;
person = Person(name:"leo");
person = nil;

初始化时,print是可以使用的。当将person设置为nil时,deinit方法不会被调用。


那最后三行的真正上下文是什么?它们在现实生活中不能这样松散地存在... - matt
那么,这就是问题所在。 - matt
如果您正在Playground中尝试此操作,那么我认为这就是为什么它无法正常工作的原因。我刚刚在Swift书中实现了“银行”示例,在Playground中deinit方法不会被调用,但如果我将代码放入应用程序并运行它,则会被调用。 - Paulw11
1
JFI:现在在Playground上运行良好。 - Bista
1个回答

19

问题在于游乐场并不是真实的生活。这也是不使用它们的另一个原因(我认为它们是苹果糟糕的错误之一)。使用一个真正的iOS应用项目,deinit将按预期被调用。

来自真实项目的例子:

class ViewController: UIViewController {
    class Person{
        let name:String;
        init(name:String){
            self.name = name;
            println("\(name) is being initialized.");
        }
        deinit{
            println("\(name) is being deInitialized.");

        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        var person:Person?;
        person = Person(name:"leo");
        person = nil;
    }
}

它能够按照你的期望完成所需功能。


你还认为“它们是苹果公司犯下的可怕错误”吗? - PaulWoodIII
3
不,现在我认为它们是魔鬼的作品。 - matt
2
分号(;),它真的必须吗? - turtle
1
@turtle 这些是原帖作者的分号。我只是想表明,如果你把原帖作者给出的代码放在正确的位置,它确实可以工作。 - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接