对弱自我,阻止和保留周期有疑问。
根据我的理解,我们需要在块中使用弱自己。 问题是,什么时候?
例如,简单的动画代码,永远不会包含弱自己..即
self.myView.alpha = 1.0;
[UIView animateWithDuration:0.2 animations:^{
self.myView.alpha = 1.0;
}];
这段代码好吗?或者我应该在阻止之前创建一个弱者并在里面使用它?
在我所有的代码和我曾经做过的所有其他项目中,从未见过使用弱自我的单行。 我现在正试图在每个区块中使用弱自己.. 只是我不确定它是否必要
期待您的意见 感谢
答案 0 :(得分:7)
当有可能保留周期时,你应该使用弱自我。
想象一下foo的一个实例强烈引用了bar。现在你给bar一个块,引用foo的自我。现在有人释放了foo,但是bar已经保留了这个块。现在foo强烈引用bar和bar在块中强有力地引用了foo。 Foo不会被释放,因此也是吧,因为酒吧正在坚持它。但唯一坚持酒吧的是现在未使用过的foo。你已经有了一个保留周期,这两个对象现在浮在内存中无法到达。
UIView的动画没有任何问题,因为在animate:方法返回之前调用了块,而UIView没有保留块。
只要看到保留周期的可能性,ARC通常会发出警告。但事实并非如此。一个好的经验法则是,当你不知道这个块会在哪里时,就会使用弱自我。希望这有点帮助。
答案 1 :(得分:4)
正如其他人所指出的那样,你绝对应该使用weakSelf
模式,否则你会有强大的参考周期(也就是保留周期)。但更一般地说,只要您不希望块保留对象本身(即使在没有涉及保留周期的情况下),您应该使用weakSelf
。
一个很好的例子是由某个视图控制器启动的网络操作。让我们说用户启动一些上传。问题是您是否希望异步上载过程保留视图控制器,即使它可能具有对该视图控制器的引用以更新某些进度条等。如果取消视图控制器,您可能不希望它保留视图控制器,即使您可能希望继续上载。
这只是一个随机的示例,但最重要的是,您可能希望在希望后台进程继续时使用weakSelf
模式,但您不希望它保留其他对象。只需看看您的功能需求并考虑强大的参考周期风险,并决定是否需要使用weakSelf
模式。
在animateWithDuration
的情况下,当视图被关闭并且强引用立即被解析时动画停止,因此没有强引用周期。