我有一个类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
,这将不起作用,因为您已经开始了释放过程。