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

标签 iphone ios memory-management memory-leaks

背景 -

我正在对一个项目使用自动引用计数。 Root View 是一个 TableView (主/详细设置),显示“幻灯片放映”列表。单击一个表格单元格,您将被带到详细 View ,该 View 由一个带有 View (viewController.view) 的 ScrollView 组成(这是“幻灯片放映”)。每个幻灯片放映都有一个封面和封底(相同的 View Controller 格式不同),它们夹在可变数量的页面之间。下面是加载幻灯片的代码:

- (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];
}

问题 -

所以我试图重用这个幻灯片 View Controller ,所以我需要 nil 并重新创建中间的页面,因为每个幻灯片都有不同数量的幻灯片。请注意幻灯片 [PageViewController] 只是一个包含 ImageView 的 View 。它有更多的功能,所以我们需要 Controller ,但是 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 是否也会释放该 View Controller 中使用的 ImageView/Labels/etc 使用的内存?

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

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

最佳答案

一般来说,您不必将其设置为 nil。在这种特定情况下,将 things 设置为 nil 什么都不做。

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

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

关于iphone - 内存管理,ARC - 什么是零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621262/

相关文章:

iphone - iPhone Enterprise(内部)诉App Store发行

iphone - iPhone-在UILabel中显示编码的字符,例如å,ä,ö

android - iOS 和 Android 中的 TableView

c++ - 我应该只为一个电话在免费商店上创建对象吗?

ios - 圆弧 : "Pointer to non-const type ' id' with no explicit ownership"

ios - 快速 watch 连接意外退出

iphone - 带有收件人显示名称和电子邮件地址的 MFMailComposeViewController

ios - 屏幕外 UITableViewCells(用于尺寸计算)不符合尺寸等级?

ios - 获取/下载应用程序的崩溃报告

iPhone内存管理