Block隐含地保留了"自我"; - 但它是否有意?

Gre*_*reg 7 objective-c ios objective-c-blocks

昨天我的最新iOS版本在Xcode上没有任何警告.在一夜之间升级到版本9.3(9E145)之后,我收到了多个警告.当我试图self->score下面的答案(1)对一个类似问题的警告消失.

但是在最近对同一个问题的回答(2)中,通过改变设置来解决问题.目前我的设置Apple LLVM 9.0 - Warnings -Objective C and ARC

在块内隐含保留"自我"是的

但我不明白Block implicitly retains 'self'下面的代码的上下文中是什么意思,所以我不能说这种行为是否是"有意"的.或者我是解决了问题还是只是隐藏了它.或者答案1是否比答案2更好.

有人可以解释Block implicitly retains 'self'在这种情况下的意义吗?谢谢.

score.alpha = 1.0;

if (sequenceState >= STATES_Count)
{
    [GraphicScore animateWithDuration:8.0f
                                delay:1.0f
                              options:UIViewAnimationOptionCurveEaseOut
                           animations:^{self->score.alpha = 0.0;} // animations:^{score.alpha = 0.0;}
                           completion:^(BOOL finished){ }];
}
[self addSubview:score];
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 17

关于隐式引用的这个警告self是有用的,因为在没有它的情况下,当浏览代码时,并不总是很明显哪些块有引入强引用循环的风险,哪些不具有.通过鼓励程序员self明确地提供这些引用(例如安全编程语言(如Swift)中所需),您最终会得到代码,您可以清楚地看到强引用周期是否是潜在问题.

所以,我鼓励你打开警告但继续self使用self->或者,如果使用属性,使用self.你引用的第一个答案所建议的那些显式隐藏引用(ivars).

然后,您可以查看self闭包的各个用途,并确保它们不会引入强参考周期的任何实际风险.如果他们这样做,您可以适当采用weakSelfor weakSelf/ strongSelfpatterns.

  • 嘿@Rob,您有什么资源可以指点我,以更好地了解这些自引用引入保留周期时的情况?我了解保留周期的概念-两个对象之间有很强的相互引用,因此,即使您删除了对这些对象的引用,它们也不会相互分配。我很难弄清楚它与积木如何一起工作,并且要远离危险。更新项目设置以显示此警告后,我收到了300条警告,大部分是由于在实例方法内的API调用完成块内使用了IVars。 (2认同)
  • 有关Swift的讨论,请参见[Swift编程语言:自动引用计数](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/ TP40014097-CH20-ID48),特别是标题为[关闭的强大参考循环]的部分(https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref / doc / uid / TP40014097-CH20-ID56)以及后面的部分,介绍了如何解决这些问题。 (2认同)
  • @JakeT. - Swift概念类似于Objective-C概念,这些参考文献对该主题进行了相当广泛的讨论.但是,如果您正在寻找Objective-C文档,请参阅[使用Objective-C编程:使用块:捕获自身时避免强引用周期](https://developer.apple.com/library/content/documentation/可可/概念/ ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html#// apple_ref/DOC/UID/TP40011210-CH8-SW16). (2认同)