【发布时间】:2018-03-30 22:18:25
【问题描述】:
昨天我最新的 iOS 版本在 Xcode 上运行时没有出现警告。在一夜之间升级到版本 9.3 (9E145) 后,我收到了多个警告。当我在answer (1) 之后尝试self->score 到类似问题时,警告消失了。
但在最近的answer (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];
【问题讨论】:
-
并不是
self->score.alpha比score.alpha更好 — 从技术上讲,它是完全相同的代码 — 很明显,该块隐含地保留了 @987654330 @。这通常是一个需要识别的非常微妙的问题。写self->property使它更明显,从而更容易在你的代码中发现这个(潜在的)问题。就像人们写(void)SomeFunction();以明显故意忽略返回值。
标签: ios objective-c objective-c-blocks