1

我有一个类 TouchInfo,它有一个类 MotionStreak 的 ivar。

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

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

我正在使用定时器来延迟streakivar 的发布,使用自定义定时器类如下:

- (void)dealloc {
    [self timedReleaseStreak];
    [super dealloc];
}

- (void)timedReleaseStreak {
    [streak fadeoutWithDelay:1.0];
    [[TimerHandler sharedTimer] object:streak action:@selector(release) delay:1.0];
}

到目前为止,它没有任何崩溃。但我想知道我是否做错了,是否有更好和推荐的方法。请指教。

p/s:请不要对 ARC 提出建议;我还没有自动发布手动引用计数魔法:P

4

1 回答 1

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];
}

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

于 2011-10-21T14:36:18.630 回答