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

Rac*_*elD 0 iphone memory-leaks memory-management ios

背景 -

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

问题 -

所以我试图重新使用这个幻灯片放映视图控制器,所以我需要在中间重新创建页面,因为每个幻灯片放映有不同数量的幻灯片.请注意,幻灯片[PageViewController]只是一个包含ImageView的视图.它具有更多功能,因此我们需要控制器,但VC的主要显示是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];
} 
Run Code Online (Sandbox Code Playgroud)

大问题 -

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

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

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

Nic*_*ore 6

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

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

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