繁体   English   中英

使用ARC在子视图上未调用Dealloc

[英]Dealloc not called on subview with ARC

我有一个不常见的体系结构。 具有一个UIViewController和许多子视图。 我使用viewView和UIViewController之类的UIView进行过渡动画。

UIView有很多子视图,我将其推入主窗口,我将removeFromSuperview一切正常,但是子视图不会调用dealloc方法。 我也尝试清洁物体

- (void) dealloc {
    NSLog(@"ActivityShowVC dealloc");
    [showView removeFromSuperview];
    showView = nil;
}

这叫。

- (void) dealloc {
    NSLog(@"ActivityShowView dealloc");

    [mainScroll removeFromSuperview];

    [titleView setDelegate:nil];
    [titleView removeFromSuperview];
    titleView = nil;

    [photoView setDelegate:nil];
    [photoView removeFromSuperview];
    photoView = nil;

    [predictionView setDelegate:nil];
    [predictionView removeFromSuperview];
    predictionView = nil;

    [calendarView setDelegate:nil];
    [calendarView removeFromSuperview];
    calendarView = nil;

    [descriptionView setDelegate:nil];
    [descriptionView removeFromSuperview];
    descriptionView = nil;
}

但这有一些问题。

如果实现了dealloc并且未调用它,那么将保留该实例。 您需要重新考虑对其的强烈引用。

除了实例释放资源外,Dealloc除了执行功能之外也不是一个好地方,因为该实例不再具有完整的功能或处于完整的状态。 像这样: [showView removeFromSuperview]; 最好在取消分配之前明确完成。

如@Greg所述,ARC不需要您在dealloc中执行的大部分或全部操作。 现在,子视图通常weak因此不需要显式的dealloc。 实际上,根据视图层次结构的拆解顺序,它们可能已经消失。

我已经解决了类似的问题。 在我的Viewcontroller中,我创建了一个NSTimer指针,当我将下面的代码放在“ viewWillDisappear”中时,将调用“ dealloc”。

if (_timer) {
        [_timer invalidate];
        _timer = nil;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM