UIView 未自动释放。我的问题在哪里?

Posted

技术标签:

【中文标题】UIView 未自动释放。我的问题在哪里?【英文标题】:UIView not autoreleased. Where is my issue? 【发布时间】:2013-10-08 18:39:05 【问题描述】:

我以编程方式基于 xib 文件创建UIViews,并将它们添加到scrollView。到目前为止,这有效。如果数量发生变化,我会重新创建UIViews 的网格(在我的例子中,所谓的主题拇指)。在重新创建新的之前,我会删除旧的。问题是内存永远不会被释放,并且每次新创建的内存使用都会堆积起来。即使我移除一个拇指,内存也不会被释放。

仪器不显示泄漏。我的ViewController 中的Dealloc 永远不会被调用。

我使用ARC,我知道我必须避免保留引用。但显然我已经使用它们并且不明白在哪里。如果有人可以给我一个提示,那就太好了,因为我在这里阅读了很多帖子,但仍然不明白。 NSZombiesEnabled 已关闭。

我的代码:

-(void)createGrid

    for (UIView *subview in self.scrollView.subviews) 
        if ([subview tag] < 10000 && ![subview isKindOfClass:[UIImageView class]]) 
            [subview removeFromSuperview];
        
    
    int col = 0;
    int row = 0;
    [self setupFetchedResultsController];
    for (int i = 0; i<[[self.fetchedResultsController fetchedObjects] count]; i++)
    
        col = i % THEME_COLUMNS;
        row = i / THEME_COLUMNS;
        ThemeThumbVC *themeThumb = [[ThemeThumbVC alloc] init];
        [self.scrollView addSubview:themeThumb.view];

        // configurate thumb
        themeThumb.managedObjectContext = self.managedObjectContext;
        themeThumb.fetchedResultsController = self.fetchedResultsController;
        themeThumb.theme = [[self.fetchedResultsController fetchedObjects] objectAtIndex:i];
        [themeThumb.themeThumbImage setImage:[UIImage imageWithContentsOfFile:[[[self.fetchedResultsController fetchedObjects] objectAtIndex:i] iconImageURL]]];
        [themeThumb setTag:i];
        [themeThumb.view setTag:i];
        [themeThumb.view setFrame:CGRectMake(col*kThemeGritXOffset+(col*1), row*kThemeGritYOffset, kThemeGritXOffset+1, kThemeGritYOffset)];
        [self addChildViewController:(UIViewController*) themeThumb];
    
    [self.scrollView setContentSize:CGSizeMake(320, row*kThemeGritYOffset+kThemeGritYOffset)];

【问题讨论】:

【参考方案1】:

如果拇指视图被子视图控制器封装,那么您是否不需要在某个时候从父视图控制器中删除子视图控制器?

如果子视图控制器没有从父视图控制器中删除,那么我最好的猜测是子视图控制器保留了它的拇指视图。

您是否考虑过使用 UICollectionViewController 创建拇指视图网格?

【讨论】:

我没有添加子视图控制器就试过了。它没有解决它。但也许有几个保留对象。是的 UICollectionViewController 会很棒,但我的客户也想在 ios 5.1 上运行它,所以我不得不自己开发网格。希望这在将来有时会改变,但现在我必须保持这种状态。 我确实尝试了另一次,我发现它实际上是你提到的:addChildViewController 是设置剩余参考的点。感谢您的意见!

以上是关于UIView 未自动释放。我的问题在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

OS X 应用程序的自动释放池在哪里创建和耗尽?

检测 UIGestureRecognizer 点击并释放以显示和删除 UIView

自动释放会隐藏 Instruments 中的泄漏吗?

使用自动释放池和环境变量进行调试

不能使用释放或自动释放。出现黄色警告:内存泄漏和未使用的变量

TableView 中 UIView 的 CAGradientLayer 未调整为自动布局