内存管理,ARC - 什么是零?

时间:2012-03-08 16:35:46

标签: iphone ios memory-management memory-leaks

背景 -

我在项目中使用自动引用计数。根视图是表格视图(主/细节设置),显示“幻灯片放映”列表。单击一个表格单元格,您将进入详细视图,其中包含一个带有视图的滚动视图(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];
}

问题 -

所以我试图重复使用这个幻灯片放映视图控制器,所以我需要在中间重新创建页面,因为每个幻灯片放映的幻灯片数量都不同。请注意,幻灯片[PageViewController]只是一个包含ImageView的视图。它具有更多功能,因此我们需要控制器,但V.C的主显示器。是ImageView。我创建了以下方法来“清空”幻灯片放映,然后再次使用新数据运行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吗?或者将页面本身设置为nil还释放了该视图控制器中使用的ImageView / Labels / etc使用的内存?

我尝试添加self.imageView = nil;到PageViewController的viewDidUnload和viewWillUnload方法(一次一个不在两者中)我意识到设置page = nil不会调用页面卸载方法。我是否正确地释放了记忆。

我读过很多文章,但我仍然不确定我是否能以最好的方式管理记忆。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:6)

通常,您不必将事物设置为零。在这种特殊情况下,将事情设置为零是无效的。

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

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