在释放父对象之后延迟释放ivar

时间:2011-10-21 13:16:16

标签: objective-c memory-management ivar

我有一个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

1 个答案:

答案 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,这将无效,因为您已经开始重新分配过程。