捕获的弱引用指向错误的对象

sho*_*hoe 1 closures weak-references swift

如果我在封闭中弱引用自我:

{[weak self] in self!.doSomethinmg()}
Run Code Online (Sandbox Code Playgroud)

并且self已经解除分配,但关闭仍然存在.是否有可能self在闭包中在将来的某个时刻变为非零 - 指向由运行时环境确定的一些随机新对象?

Mar*_*n R 5

指针是一个变量,其值是一个内存地址.对于弱指针也是如此,但是nil如果指向对象被释放,则弱指针的值(由于某些运行时魔术)设置为.如果稍后在同一存储器位置创建任何新对象,则无关紧要,弱指针变量保持不变nil.

所以

{ [weak self] in /* ... */ }
Run Code Online (Sandbox Code Playgroud)

使用弱指针变量创建一个闭包.该变量设置nil为取消分配指向对象时.这可能发生在调用闭包之前或执行闭包期间,所以甚至

{ [weak self] in
   if (self != nil) self!.doSomethinmg()
}
Run Code Online (Sandbox Code Playgroud)

是不安全的,如果在测试和方法调用之间取消分配对象,则可能会崩溃.

但在任何时候,弱指针要么指向原始对象实例,要么指向nil.它永远不会指向其他一些对象实例.(这可能发生在无主参考文献中.)

正如洛伦佐所说,不要强行打开弱指针.使用可选链接或在闭包内创建强引用.