我有一个TouchInfo类,它有一个类MotionStreak的ivar。
@interface TouchInfo : NSObject {
MotionStreak *streak;
}
...
@end
这个类基本上处理触摸事件并绘制触摸后的运动条纹。我想释放TouchInfo
的实例,当用户释放他/她的手指时,该实例与特定触摸相关联,但我希望运动条纹在淡出之前保持0.5到1.0秒,所以我无法释放{ {1}} streak
dealloc
类的方法中的{1}}。{/ p>
我正在使用计时器来延迟释放TouchInfo
ivar,使用自定义计时器类,如下所示:
streak
到目前为止,它没有任何崩溃。但我想知道我是不是错误地做了这个,如果有更好的和推荐的做法。请指教。
p / s:请不要对ARC提出建议;我还没有自动发布手动引用计数魔法:P
答案 0 :(得分:0)
由于块在复制时会保留它们引用的任何对象,因此可以使用它们来实现动画,这将阻止在释放块之前释放对象。
以下示例使用+[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
,这将无效,因为您已经开始重新分配过程。