繁体   English   中英

ARC内存管理-无效什么?

[英]Memory Management, ARC - what to nil?

背景 -

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

- (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的视图。 它具有更多功能,因此我们需要控制器,但是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];
} 

大问题 -

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

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

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

通常,您不必将其设置为nil。 在这种特定情况下,将事情设置为nil无济于事。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM