我有一个父UIView
和一个UITextView
作为其中一个子视图。
我创建了一个按钮来解雇父UIView
,如下所示:
-(void)cancelButtonPressed:(UIButton *)sender
{
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.frame = CGRectZero;
} completion:^(BOOL finished) {
if (finished) {
[self removeFromSuperview];
}
}];
}
我可以说父母UIView
没有被释放,因为如果我在UITextView
中输入了一些文字并将其解雇,那么当我再次打开UIView
时,空白UITextView
,再次出现相同的文字。
我检查了Leaks
工具,但我没有看到任何泄漏。所以我猜测我是否有某种保留周期或什么。
更新:我有另一个对象(AppDelegate
)持有UIView
的实例:_myView
作为全局变量,如下所示:
_myView = [[MyView alloc] init];
_myView.nameLabel.text = _user.screen_name;
[_window addSubview:_myView];
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
_myView.frame = CGRectZero;
} completion:nil];
但是为了避免保留周期,我应该像这样创建一个弱自我:__weak MyView *weakSelf
并在动画块中执行此操作:[weakSelf removeFromSuperview]
?
答案 0 :(得分:0)
我还尝试在视图本身上调用removeFromSuperview
,但这并不会导致视图被释放。
如果要释放视图,请使用使用委托的方法。这样,一旦动画完成,您就可以在视图上调用removeFromSuperview
,并将其设置为nil
。这对我来说过去很有用。
因此,您可以向要关闭动画的视图类添加方法,您将在其中执行动画。将视图控制器设置为视图的委托,并从该动画的完成块调用委托上的某个方法。
您可以为此创建自己的协议。如果保持足够的通用性,并且只关注动画回调,则可以在所有视图控制器中重用该协议。
答案 1 :(得分:0)
内存管理和逻辑是独立的事情。内存泄漏永远不会更改程序的行为。显示内容的行为由您告诉它显示的内容控制。如果它显示与以前相同的东西,那么你必须给它同样的东西以某种方式显示。即使你以某种方式泄露了原始的东西,如果你传递新的东西来显示它,它会显示那个东西。所以看看你的逻辑。内存管理与您所看到的内容无关。