Dealloc没有用ARC调用子视图

时间:2013-12-25 15:54:18

标签: ios objective-c uiview uiviewcontroller automatic-ref-counting

我有一个不常见的架构。有一个UIViewController和许多子视图。我使用UIView,如viewController和UIViewController进行过渡动画。

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;
}

但这有一些问题。

2 个答案:

答案 0 :(得分:5)

如果dealloc已实现且未被调用,则会保留实例。你需要重新考虑对它的强烈引用。

除了释放资源之外,Dealloc不是做任何其他事情的好地方,因为实例不再完全正常,也不是完整状态。在重新分配之前,最好明确地执行以下操作:[showView removeFromSuperview];

正如@Greg所说,在ARC下不需要dealloc中的大部分或全部内容。子视图现在通常为weak,因此不需要明确的dealloc。实际上,它们可能已经消失,具体取决于视图层次结构的拆卸顺序。

答案 1 :(得分:2)

我已经解决了类似的问题。在我的Viewcontroller中,我创建了一个NSTimer指针,当我将下面的代码放在' viewWillDisappear' dealloc'被称为。

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