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

Iphone 内存管理,ARC-什么是零?,iphone,ios,memory-management,memory-leaks,Iphone,Ios,Memory Management,Memory Leaks,背景- 我在一个项目上使用自动引用计数。根视图是一个表视图(主/详细设置),显示“幻灯片放映”列表。单击表格单元格,您将进入详细视图,该视图由滚动视图组成,其中包含视图(viewController.view)(这是“幻灯片放映”)。每个幻灯片放映都有一个封面和封底(同一个视图控制器的格式不同),夹在不同页数的中间。以下是加载幻灯片放映的代码: - (void)loadScrollView { // The front and back cover are set in Interfac

背景-

我在一个项目上使用自动引用计数。根视图是一个表视图(主/详细设置),显示“幻灯片放映”列表。单击表格单元格,您将进入详细视图,该视图由滚动视图组成,其中包含视图(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];
}
-(无效)加载滚动视图
{    
//封面和后盖在Interface Builder中设置,因为它们
//每次幻灯片放映都会重复使用,只需更改标签即可。
[self.scrollView添加子视图:self.frontCoverViewController.view];
[self.frontcoverview控制器setCoverTitle:_data.name creationDate:_data.creationDate isfrontcovert:YES];
[self.pagesArray addObject:self.frontCoverViewController];
for(int i=0;i<[self-getTotalNumberOfComps];i++)
{
PageViewController*pageView=[[PageViewController alloc]init];
pageView.data=[[u compsArray objectAtIndex:i];
[_scrollviewaddsubview:pageView.view];
pageView.data.imgView=pageView.imageView;
pageView.slideShowViewController=self;
[_pagesarrayaddobject:pageView];
}
[self.scrollView addSubview:self.backCoverViewController.view];
[self.backcoverview控制器setCoverTitle:_data.name creationDate:_data.creationDate isfrontcovert:否];
[self.pagesArray addObject:self.backCoverViewController];
[self.scrollView将子视图带到前面:_frontCoverViewController.view];
[自设置当前页面: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];
} 
-(void)安全清空CrollView
{
对于(int i=0;i<[self.pagesArray count];i++)
{
如果(i==0&&i==([self.pagesArray count]-1)){
CoverViewController*cover=(CoverViewController*)[self.pagesArray对象索引:i];
[cover.view从SuperView移除];
}否则{
PageViewController*页面=(PageViewController*)[self.pagesArray对象索引:i];
[page.view removeFromSuperview];
第页=无;
}
}
self.pagesArray=nil;
self.pagesArray=[[NSMutableArray alloc]init];
} 
大问题-

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

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


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

一般来说,不应该将值设置为零。在这个特定的例子中,将things设置为nil意味着什么也不做

page=nil
是多余的,因为变量
页面
随后立即超出范围。ARC知道这一点,不需要您将其设置为零


self.pagesArray=nil
是多余的,因为后面跟着的是
self.pagesArray=[[NSMutableArray alloc]init]。第二行本身就足够了。

一般来说,您不应该将值设置为零。在这个特定的例子中,将things设置为nil意味着什么也不做

page=nil
是多余的,因为变量
页面
随后立即超出范围。ARC知道这一点,不需要您将其设置为零


self.pagesArray=nil
是多余的,因为后面跟着的是
self.pagesArray=[[NSMutableArray alloc]init]。第二行就足够了。

谢谢你的第二部分,我不知道重新初始化数组和清空数组是一样的。所以为了验证,为了达到我想要的效果,我只需要从子视图中删除每个页面,然后清除列表(或从列表中删除页面),现在因为没有引用它-ARC只是释放内存?我不确定您的代码是否正确,但我希望从父视图中删除所有子视图就足够了。您可能不需要显式地将它们从数组中删除,因为一旦数组被释放(当没有更多的引用时,ARC将这样做),数组将释放内容。简言之,它看起来不错。我建议您使用泄漏工具对应用程序进行分析,以查看是否存在实际泄漏。非常感谢您的帮助。我一直在分析,但我在这一点上是新的,所以我不准确的工具,因为我需要,所以我只是想确认一下。谢谢again@Thank第二部分我没有意识到重新初始化数组与清空数组是一样的。所以为了验证,为了达到我想要的效果,我只需要从子视图中删除每个页面,然后清除列表(或从列表中删除页面),现在因为没有引用它-ARC只是释放内存?我不确定您的代码是否正确,但我希望从父视图中删除所有子视图就足够了。您可能不需要显式地将它们从数组中删除,因为一旦数组被释放(当不再有对它的引用时,ARC会这样做