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对象中有一些强指针,它正在保留自己。谢谢各位,我刚刚发现另一个视图有一个强指针指向它,因此它不会在应用程序生命周期中被释放。现在我已经修好了。谢谢,我会更仔细地研究内存管理。谢谢,我会更仔细地研究内存管理。我明白你的想法了。基本上,您需要在某个地方将其设置为零,即使您将其从超级视图中删除。谢谢。我知道你的想法了。基本上,您需要在某个地方将其设置为零,即使您将其从超级视图中删除。谢谢