繁体   English   中英

弱自我

[英]WeakSelf in blocks

有一个关于自我弱小的问题,阻止并保持生命周期。

通过这本书,我了解到我们需要在块中使用弱势自我。问题是,什么时候?

例如简单的动画代码,从不包含弱点。

self.myView.alpha = 1.0;
[UIView animateWithDuration:0.2 animations:^{
self.myView.alpha = 1.0; 
}];

这个代码可以吗? 还是我应该在块之前创建一个弱者并在内部使用它?

在我从事过的所有代码和所有其他项目中,从未见过使用弱自我的一行。 我现在正尝试在每个块中使用弱点。。只是我不确定是否有必要

期待您的意见谢谢

如果存在保留周期,则应使用弱自我。

想象一下foo的实例对bar有很强的引用。 现在,您为bar提供一个引用foo自身的块。 现在有人释放了foo,但是bar阻止了它。 现在foo对bar有很强的引用,而bar在块中对foo有很强的引用。 Foo将不会被释放,因此也不会释放,因为bar会一直坚持下去。 但是唯一要坚持的是现在未使用的foo。 您已经拥有了一个保留周期,并且两个对象现在都无法在内存中浮动。

UIView的动画没有问题,因为在animate:方法返回之前调用了该块,并且UIView并未保留该块。

ARC通常会在发现保留周期的可能性时向您发出警告。 但这并非总是如此。 一个好的经验法则是,只要您不知道该障碍物将在何处出现,就使用弱的自我。

希望这会有所帮助。

正如其他人指出的那样,在否则您将拥有较强的参考周期(又称为保留周期)的情况下,绝对应该使用weakSelf模式。 但是更普遍的是,每当您不希望块保留对象本身时(即使在不涉及保留周期的情况下),也应使用weakSelf

一个很好的例子是由某个视图控制器启动的网络操作。 假设用户启动了一些上传。 问题是您是否希望异步上传过程保留视图控制器,即使它可能引用该视图控制器来更新某些进度条等。 即使关闭了视图控制器,您也可能不希望它保留视图控制器,即使您可能希望继续上传。

这只是一个随机的示例,但最重要的是,您可能希望在后台进程继续进行时每次都使用weakSelf模式,但又不想保留其他对象。 只需查看您的功能需求并考虑强大的参考周期风险,然后决定是否需要采用weakSelf模式即可。

animateWithDuration的情况下,当关闭视图并立即解析强参考时,动画将停止,因此不存在强参考周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM