Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将removeFromSuperview发送到self-View';不要在我的场景中释放自己_Ios_Objective C_Uiview_Retaincount_Retain Cycle - Fatal编程技术网

Ios 将removeFromSuperview发送到self-View';不要在我的场景中释放自己

Ios 将removeFromSuperview发送到self-View';不要在我的场景中释放自己,ios,objective-c,uiview,retaincount,retain-cycle,Ios,Objective C,Uiview,Retaincount,Retain Cycle,我有一个父视图UIView和一个UITextView作为子视图之一。 我创建了一个按钮来关闭父视图,如下所示: -(void)cancelButtonPressed:(UIButton *)sender { [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.frame = CGRectZero; } complet

我有一个父视图
UIView
和一个
UITextView
作为子视图之一。 我创建了一个按钮来关闭父视图,如下所示:

-(void)cancelButtonPressed:(UIButton *)sender
{
    [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.frame = CGRectZero;
    } completion:^(BOOL finished) {
        if (finished) {
            [self removeFromSuperview];
        }
    }];
}
_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];
我可以看出,父级
UIView
没有被释放,因为如果我在
UITextView
中键入一些文本并将其取消,当我再次打开
UIView
时,而不是空白的
UITextView
,相同的文本再次出现在其中

我检查了
泄漏
工具,但没有发现任何泄漏。所以我猜我是否有某种保留周期或者什么

更新:我有另一个对象(即
AppDelegate
),它持有
UIView
的实例:
\u myView
作为全局变量,如下所示:

-(void)cancelButtonPressed:(UIButton *)sender
{
    [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    self.frame = CGRectZero;
    } completion:^(BOOL finished) {
        if (finished) {
            [self removeFromSuperview];
        }
    }];
}
_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];

但是为了避免保留循环,我是否应该创建这样一个弱自我:
\uu弱MyView*weakSelf
在动画块中执行以下操作:
[weakSelf removeFromSuperview]

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

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

因此,您可以将一个方法添加到要在其中制作动画的视图类中。将视图控制器设置为视图的代理,并从该动画的完成块中调用代理上的某些方法


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

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

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

因此,您可以将一个方法添加到要在其中制作动画的视图类中。将视图控制器设置为视图的代理,并从该动画的完成块中调用代理上的某些方法


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

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

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

如何创建父视图?可能是您创建了它并存储了对它的强引用吗?请显示您添加和处理
UIView
的代码。您可能在self对象中有一些强指针,它正在保留自己。谢谢各位,我刚刚发现另一个视图有一个强指针指向它,因此它不会在应用程序生命周期中被释放。现在我已经修复了它。如何创建父视图?可能是您创建了它并存储了对它的强引用吗?请显示您添加和处理
UIView
的代码。您可能在self对象中有一些强指针,它正在保留自己。谢谢各位,我刚刚发现另一个视图有一个强指针指向它,因此它不会在应用程序生命周期中被释放。现在我已经修好了。谢谢,我会更仔细地研究内存管理。谢谢,我会更仔细地研究内存管理。我明白你的想法了。基本上,您需要在某个地方将其设置为零,即使您将其从超级视图中删除。谢谢。我知道你的想法了。基本上,您需要在某个地方将其设置为零,即使您将其从超级视图中删除。谢谢