【问题标题】:Memory Management, ARC - what to nil?内存管理,ARC - 什么是零?
【发布时间】:2012-03-26 03:34:04
【问题描述】:

背景 -

我在一个项目上使用自动引用计数。根视图是显示“幻灯片放映”列表的表格视图(主/详细设置)。单击一个表格单元格,您将进入详细视图,该视图由一个带有视图 (viewController.view) 的滚动视图组成(这是“幻灯片放映”)。每个幻灯片放映都有一个封面和封底(相同的视图控制器格式不同),它们夹着可变数量的页面。这是加载幻灯片的代码:

- (void)loadScrollView
{    
// The front and back cover are set in Interface Builder because they
// are reused for every slide show, just labels are changed.
[self.scrollView addSubview:self.frontCoverViewController.view];
[self.frontCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:YES];
[self.pagesArray addObject:self.frontCoverViewController];

for (int i = 0; i < [self getTotalNumberOfComps]; i++) 
{
    PageViewController *pageView = [[PageViewController alloc] init];
    pageView.data = [_compsArray objectAtIndex:i];

    [_scrollView addSubview:pageView.view];
    pageView.data.imgView = pageView.imageView;
    pageView.slideShowViewController = self;
    [_pagesArray addObject:pageView];
}

[self.scrollView addSubview:self.backCoverViewController.view];
[self.backCoverViewController setCoverTitle:_data.name creationDate:_data.creationDate isFrontCover:NO];
[self.pagesArray addObject:self.backCoverViewController];

[self.scrollView bringSubviewToFront:_frontCoverViewController.view];
[self setCurrentPage:0];
}

问题 -

所以我试图重用这个幻灯片视图控制器,所以我需要 nil 并重新创建中间的页面,因为每个幻灯片都有不同数量的幻灯片。请注意,幻灯片 [PageViewController] 只是一个带有 ImageView 的视图。它具有更多功能,因此我们需要控制器,但需要 V.C. 的主显示器。是图像视图。在使用新数据再次运行 loadScrollView 之前,我创建了以下方法来“清空”幻灯片放映。这是空方法:

- (void)saflyEmptyScrollView
{
for (int i = 0; i < [self.pagesArray count]; i++) 
{
    if (i == 0 && i == ([self.pagesArray count]-1)) {
        CoverViewController *cover = (CoverViewController*)[self.pagesArray objectAtIndex:i];
        [cover.view removeFromSuperview]; 
    } else {
        PageViewController *page = (PageViewController*)[self.pagesArray objectAtIndex:i];
        [page.view removeFromSuperview];
        page = nil;
    }
}
self.pagesArray = nil;
self.pagesArray = [[NSMutableArray alloc] init];
} 

大问题 -

我的主要问题是我需要将每个页面的 ImageView 设置为零吗?或者将页面本身设置为 nil 是否也会释放该视图控制器中使用的 ImageView/Labels/etc 使用的内存?

我尝试添加 self.imageView = nil;到 PageViewController 的 viewDidUnload 和 viewWillUnload 方法(一次一个,而不是两个),我意识到设置 page = nil 不会调用页面的 Unload 方法。我是否正确释放了内存。

我已经阅读了很多文章,但我仍然不确定我是否以最好的方式管理内存。非常感谢您的帮助!

【问题讨论】:

    标签: iphone ios memory-management memory-leaks


    【解决方案1】:

    通常,您不必将事物设置为 nil。在这种特定情况下,将 things 设置为 nil 是什么都不做。

    page = nil; 行是多余的,因为变量page 无论如何都会立即超出范围。 ARC 知道这一点,不需要您将其设置为 nil。

    self.pagesArray = nil; 是多余的,因为您使用self.pagesArray = [[NSMutableArray alloc] init]; 跟随它。第二行就足够了。

    【讨论】:

    • 谢谢你的第二部分我没有意识到重新初始化数组与清空它是一样的。所以只是为了验证,为了达到我想要的效果,我只需要从子视图中删除每个页面,然后清除列表(或从列表中删除页面),现在因为没有引用它 - ARC 只是释放内存?
    • 我不确定您的代码是否准确,但我希望从父视图中删除所有子视图视图就足够了。您可能不需要明确地从数组中删除它们,因为一旦数组被释放(当没有更多对它的引用时,ARC 将执行此操作),数组无论如何都会释放内容。简而言之 - 它看起来不错。我建议使用 Leaks 工具对您的应用程序进行分析,以查看是否存在实际泄漏。
    • 非常感谢您的帮助。我一直在分析,但是我是新手,所以我对工具的准确度没有我需要的那么高,所以我只是想确认一下。再次感谢@
    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2011-11-14
    • 2013-10-03
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多