【问题标题】:Sending removeFromSuperview to self didn't release itself in my scenario在我的场景中,将 removeFromSuperview 发送给 self 并没有释放自己
【发布时间】:2015-11-25 01:13:27
【问题描述】:

我有一个父 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 时, SAME 文本再次出现在其中。

我检查了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]

【问题讨论】:

  • 如何创建父视图?可能是您创建它并存储对它的强引用?
  • 请显示您添加和处理UIView 的代码。
  • 你可能在 self 对象中有一些强指针,它保留了自己。
  • 谢谢大家,我刚刚发现有另一个视图有一个强指针,所以它不会在应用程序生命周期中被释放。现在我已经修好了。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我明白你的想法是什么。基本上,即使您将其从超级视图中删除,您也需要将其设置为 nil。谢谢。
【解决方案2】:

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

【讨论】:

  • 谢谢,我会仔细研究内存管理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2020-10-30
  • 1970-01-01
相关资源
最近更新 更多