首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从“`deinit`”中走私“`self`”

从“`deinit`”中走私“`self`”
EN

Stack Overflow用户
提问于 2019-09-13 02:13:15
回答 1查看 131关注 0票数 7

如果我将self从我的deinit中偷偷带出来,通过将它赋给某个外部强引用,会发生什么?下面的代码显然不是很好的格式:

代码语言:javascript
复制
class C: CustomStringConvertible {
    let s = "abc"

    var description: String {
        return "C(id: \(ObjectIdentifier(self)), s: \(s))"
    }

    deinit {
        print("deinit")
        globalObject = self
    }
}

var globalObject: C!

do {
    let localObject = C()
    print("localObject: \(localObject)")
    print("end of `do`")
}

print("globalObject: \(globalObject!)")

你不能只是在deinit中间“改变主意”去初始化一个对象。但有趣的是,这段代码是不确定的,它偶尔会成功完成,打印:

代码语言:javascript
复制
localObject: C(id: ObjectIdentifier(0x00007f9063f00960), s: abc)
end of `do`
deinit
globalObject: C(id: ObjectIdentifier(0x00007f9063f00960), s: abc)

我使用Code Runner运行它,它只使用swiftc运行单个文件的Swift脚本。因此,这里没有意外的Playground拥有的引用。

非决定论从何而来?

EN

回答 1

Stack Overflow用户

发布于 2019-09-13 05:44:50

这不是一个答案,但对于评论来说太长了:

有趣的是,我只是附加了:

代码语言:javascript
复制
for _ in 1...1000000 {
    print("intermediate: \(globalObject!)")
}
print("globalObject: \(globalObject!)")

然后:

代码语言:javascript
复制
swiftc test.swift
for ((i = 0; i < 10000; i++)); do
    ./test  | fgrep globalObject
done

我得到的是(这10000次运行中只有一次):

致命错误:对象保留的时间太长A(44854,0x10a92f5c0) malloc:释放的对象的校验和不正确0x7fcc1ec02b98:可能在释放后进行了修改。

损坏的值: 0x7ffffffe00000000

test(44854,0x10a92f5c0) malloc:*在malloc_error_break中设置断点进行调试

globalObject: C(id: ObjectIdentifier(0x00007f7f452006c0),s: abc)

test(61212,0x114d7e5c0) malloc:释放对象0x7fe063e00008的校验和不正确:可能在释放后进行了修改。

损坏的值: 0x4ffffffe00000000

test(61212,0x114d7e5c0) malloc:*在malloc_error_break中设置断点进行调试

下一次运行:

测试(7016,0x10682d5c0) malloc: tiny_free_list_remove_ptr:内部不变量损坏(上一次的下一个ptr ):ptr=0x7fb2e0805fd0,prev_next=0x7f92e0805fd0

这似乎是一些竞争条件,但我不知道谁在这里产生线程。顺便说一句:

代码语言:javascript
复制
swiftc -version
Apple Swift version 5.0.1 (swiftlang-1001.0.82.4 clang-1001.0.46.5)
Target: x86_64-apple-darwin18.7.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57912403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档