gpt4 book ai didi

ios - UIView 子类未被释放

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:09:32 25 4
gpt4 key购买 nike

我有一个未被释放的子类 UIView。我知道只有一个类正在创建我的 View 实例。在我看来,我有一个 NSTimer ivar。如果我注释掉那个计时器,并且当我点击这个 View Controller 上的取消按钮时,就会调用这个 View 中的 dealloc。如果我不注释掉计时器,则永远不会调用 dealloc。

//CustomUIView
- (id) initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_pollTimer = [[NSTimer scheduleTimerWithTimeInterval:0.2 target:self selector:@selector(onPollTimerFired:) userInfo:nil repeats:YES] retain];
}
}

我想保留对此计时器的引用,因为有时我希望暂停计时器。现在,我可以在我的 View 上有一个计时器属性,并且在引用我的自定义 uiview 的类的 dealloc 方法中,我可以在释放所述 View 之前使它无效。我不太喜欢这种方法,因为我不想将此计时器暴露给外部实体。

有人有什么想法吗?

最佳答案

NSTimer always retains its target .这有两个含义:

  1. 您不应该让 View (它是计时器的目标)保留计时器,因为这会造成循环。

  2. 只要计时器保持事件状态,您的 View 就永远不会被释放。

相反,您应该在 View 完成时对计时器调用 invalidate。完成此操作后,当其引用计数变为零时, View 将被解除分配

通常这发生在 View 从它的父 View 中移除时;如果你想让它继续使用它的计时器直到它发生然后被释放,你可以覆盖 removeFromSuperview 使计时器无效然后调用 super

关于ios - UIView 子类未被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11174488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com