WeakSelf在块中

有一个关于弱自我,阻止和保留周期的问题。

按照我的理解,我们需要在块中使用弱自己。问题是,何时?

例如,简单的动画代码,永远不会包含弱自己..

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

这段代码好吗? 或者我应该在阻止之前创建一个弱自己并在里面使用它?

在我所有的代码和我曾经做过的所有其他项目中,从未见过使用弱自我的单行。 我现在正试图在每个区块中使用弱自己…这只是我不确定它是否必要

期待您的意见谢谢

正如其他人所指出的那样,你绝对应该使用weakSelf模式,否则你会有强大的参考周期(也就是保留周期)。 但更一般地说,只要您不希望块保留对象本身(即使在没有涉及保留周期的情况下),您应该使用weakSelf

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

这只是一个随机的示例,但是底线,您可能希望在希望后台进程继续时使用weakSelf模式,但您不希望它保留其他对象。 只需看看您的function需求并考虑强大的参考周期风险,并决定是否需要使用weakSelf模式。

animateWithDuration的情况下,当视图被关闭并且强引用立即被解析时,动画停止,因此没有强引用循环。

当有可能保留周期时,你应该使用弱自我。

想象一下foo的一个实例强烈引用了bar。 现在你给bar一个块,引用foo的self。 现在有人发布了foo,但是bar已经保留了这个块。 现在foo强烈引用bar和bar在块中强有力地引用了foo。 Foo不会被释放,因此也是吧,因为酒吧正在坚持它。 但唯一坚持酒吧的是现在未使用过的foo。 你有一个保留周期,这两个对象现在浮在内存中无法到达。

UIView的动画没有任何问题,因为在animate:方法返回之前调用了块,而UIView没有保留块。

只要看到保留周期的可能性,ARC通常会发出警告。 但情况并非总是如此。 一个好的经验法则是,只要你不知道块的位置,就会使用弱自我。

希望这有点帮助。