将removeFromSuperview发送给self并没有在我的场景中释放自己

时间:2015-08-31 04:07:46

标签: ios objective-c uiview retaincount retain-cycle

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

2 个答案:

答案 0 :(得分:0)

我还尝试在视图本身上调用removeFromSuperview,但这并不会导致视图被释放。

如果要释放视图,请使用使用委托的方法。这样,一旦动画完成,您就可以在视图上调用removeFromSuperview,并将其设置为nil。这对我来说过去很有用。

因此,您可以向要关闭动画的视图类添加方法,您将在其中执行动画。将视图控制器设置为视图的委托,并从该动画的完成块调用委托上的某个方法。

您可以为此创建自己的协议。如果保持足够的通用性,并且只关注动画回调,则可以在所有视图控制器中重用该协议。

答案 1 :(得分:0)

内存管理和逻辑是独立的事情。内存泄漏永远不会更改程序的行为。显示内容的行为由您告诉它显示的内容控制。如果它显示与以前相同的东西,那么你必须给它同样的东西以某种方式显示。即使你以某种方式泄露了原始的东西,如果你传递新的东西来显示它,它会显示那个东西。所以看看你的逻辑。内存管理与您所看到的内容无关。