我做了一个小的“加载器”,我可以在需要时粘贴在 UI 上。很像 UISpinnerView。
它有一些逻辑(我为这篇文章简化了代码块中的代码)需要递归调用它。我这样做:
- (void) blink {
tick++;
if (tick > kNumberOfLights)
tick = 0;
UIView *lightOne = [self viewWithTag:kLightStartIndex];
UIView *lightTwo = [self viewWithTag:kLightStartIndex+1];
[UIView animateWithDuration:0.5
delay: 0.0
options: UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionCurveEaseOut
animations:^{
if (tick == 0) {
[lightOne setAlpha:kLightOn];
[lightTwo setAlpha:kLightOff];
} else if (tick == 1) {
[lightOne setAlpha:kLightOff];
[lightTwo setAlpha:kLightOn];
}
}
completion:^(BOOL finished){
[self blink];
}];
}
[self blink]
当视图添加到超级视图时调用该方法。
Loader 类中没有保留任何对象,因此当我在超级视图中删除它时,它会被释放。问题是如果我释放视图时动画块正在运行,完成块将调用一个已释放的对象并导致错误:
(20380,0xa0a29540) malloc: * mmap(size=2097152) failed (error code=12) * error: can't allocate region
在控制台和错误中:
__[LoaderClass 闪烁]_block_invoke_2
在调试导航器中。
从超级视图中删除视图时,如何确保正确拆除视图?