在解除分配父对象后延迟 ivar 的释放



我有一个类TouchInfo,它有一个类MotionStreak的变量

@interface TouchInfo : NSObject {
    MotionStreak *streak;
}
...
@end

这个类基本上处理触摸事件并绘制一个跟随触摸的运动条纹。当用户释放他/她的手指时,我想释放与特定触摸相关联的TouchInfo实例,但是我希望运动条纹在淡出之前保持0.5到1.0秒,所以我不能在TouchInfo类的dealloc方法中释放streak ivar。

我使用定时器来延迟streak ivar的发布,使用自定义定时器类如下:

- (void)dealloc {
    [self timedReleaseStreak];
    [super dealloc];
}
- (void)timedReleaseStreak {
    [streak fadeoutWithDelay:1.0];
    [[TimerHandler sharedTimer] object:streak action:@selector(release) delay:1.0];
}
到目前为止,它没有任何崩溃。但我想知道我这样做是否错了,是否有更好的方法和推荐的方法。请建议。

p/s: Please, no advice on ARC;我还没有自动发布手动引用计数巫术:P

由于块在复制时保留了它们引用的任何对象,因此您可以使用它们来实现动画,这将防止对象被释放,直到块被释放。

下面是一个使用+[UIView animateWithDuration:animations:completion:]将视图淡出并从视图层次中移除的示例。为了以后使用完成块,它必须将其复制到堆中,这将导致视图被保留。

- (void)dealloc {
    UIView *localStreak = streak;
    [UIView animateWithDuration:1.0 animations:^ {
        localStreak.alpha = 0.0;
    } completion:^ (BOOL finished) {
        [localStreak removeFromSuperview];
    }];
    [streak release];
    [super dealloc];
}

注意,我将streak ivar复制到一个局部变量,并在块中使用它。如果您尝试直接使用ivar,它将保留self,这将不起作用,因为您已经开始了释放过程。

相关内容

  • 没有找到相关文章

最新更新