背景 -
我在项目中使用自动引用计数。根视图是表格视图(主/细节设置),显示“幻灯片放映”列表。单击一个表格单元格,您将进入详细视图,其中包含一个带有视图的滚动视图(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不会调用页面卸载方法。我是否正确地释放了记忆。
我读过很多文章,但我仍然不确定我是否能以最好的方式管理记忆。非常感谢你的帮助!
答案 0 :(得分:6)
通常,您不必将事物设置为零。在这种特殊情况下,将事情设置为零是无效的。
行page = nil;
是多余的,因为变量page
无论如何都会在之后立即超出范围。 ARC知道这一点,不需要你将它设置为零。
并且self.pagesArray = nil;
是多余的,因为您使用self.pagesArray = [[NSMutableArray alloc] init];
跟随它。第二行本身就足够了。