macos – Swift:在deinit方法中没有println的输出(不使用playground)

macos – Swift:在deinit方法中没有println的输出(不使用playground),第1张

概述这是我的测试代码(在终端中运行): #!/usr/bin/xcrun swiftvar count = 0; // for reference countingclass A { init() { count++; } deinit { println("A deinit") count--; }}va @H_301_1@ 这是我的测试代码(在终端中运行):

#!/usr/bin/xcrun swiftvar count = 0;  // for reference countingclass A {    init() {        count++;    }    deinit {        println("A deinit")        count--;    }}var a: A? = A()println(count)a = nil  // no output if I comment out this statementprintln(count)

输出

1A deinit0

如果上面提到的行被注释掉,则没有输出“A deinit”.输出将是:

11

我用swiftc编译代码但结果仍然相同. (xcrun swiftc -o test test.swift)

通过设计,当程序退出时,stdout将被关闭,或者当它们被破坏时,对象仍被引用(通过什么?)?

更新:感谢@Logan,现在我有更多关于它的细节.

当它在函数内部运行时,即使我注释掉a = nil,它也会输出A deinit:

#!/usr/bin/xcrun swiftclass A {    deinit {        println("A deinit")    }}func test() {    var a: A? = A()    //a = nil}test()

我没有在Xcode中使用游乐场. : – $

更新

#!/usr/bin/xcrun swiftimport Foundationclass A {    deinit {        var s = "A deinit"        println(s)        var a: A? = A()        a = nil        var error: NSError?        var path = "\(NSfileManager.defaultManager().currentDirectoryPath)/swift_test.txt"        if s.writetofile(path,atomically: true,enCoding: NSUTF8StringEnCoding,error: &error) {            println("file saved at \(path)")        } else {            println(error)        }    }}//func test() {    var a: A? = A()//}//test()

结果:除非在测试函数中运行,否则不输出到stdout或文件.

解决方法 虽然我没有看到一个明确的引用说“Swift的deinit与ObjC的dealloc具有完全相同的语义”,但很难想象这不是真的,因为Swift和ObjC对象都由ARC管理,一般来说可以互换.

鉴于此,这是完全可以预期的. Cocoa在程序终止时不会释放对象.它只是终止,泄漏所有内存,文件句柄和其他系统资源,并将其留给 *** 作系统进行清理.这使程序终止速度明显快于其他情况.

这是一个重要的观点,因为这意味着您通常不应该使用deinit来管理除OS管理的资源之外的任何内容(当然不是您需要运行的任何内容).当然,即使在C中,也无法保证析构函数运行.如果你崩溃了,它就不会发生,你的程序将不得不处理它.您可以将其想象为所有Cocoa程序在终止时悄然崩溃.

所以在你的情况下,a = nil会导致deinit运行,而程序终止则不会.

总结

以上是内存溢出为你收集整理的macos – Swift:在deinit方法中没有println的输出(不使用playground)全部内容,希望文章能够帮你解决macos – Swift:在deinit方法中没有println的输出(不使用playground)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/998915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存