【发布时间】:2017-11-22 01:16:45
【问题描述】:
var label1: UILabel? = UILabel()
weak var label2 = label1
label1 = nil
这里有一些困惑: 在这 3 行之后,label1 为 nil,但 label2 仍然有引用。根据我的理解,它应该是 nil ,因为它很弱,所以它不会对引用有很强的把握。
那么,为什么这不起作用?
另一个问题:
func request() { [weak self] complete in
guard let strongSelf = self else { return }
strongSelf.printSomething()
strongSelf.doSomething()
}
在互联网请求回调中,我指定了弱自我,并保护有一个强自我,以确保如果自我没有被释放,它会成功。问题是,如果当守卫之后的线路运行时,self 被释放到其他地方,strongSelf 还活着吗?它对自我有很强的把握吗? (给 self 添加 +1 引用计数,所以 self 的内存不会被释放?)
【问题讨论】:
-
您是否已将标签添加到视图中?如果是这样,视图将持有对它的强引用,因此 label2 不会是
nil。在回答您的其他问题时,是的strongSelf将阻止对象被释放 -
@Paulw11 不,我在 Playground 中进行了第一次测试,只有 3 行代码。标签不会插入到任何视图中。关于第二个答案,是不是说strongSelf给弱self加了引用计数+1就可以了?
-
你不能相信操场上会有这种东西。在真正的应用中测试它
-
@Paulw11 实际上我确实在实际项目中尝试过,仍然给出相同的结果..
-
@paulw11 实际上,你是对的,只是做了一些测试以使其工作
标签: ios swift memory closures block