iOS Developer PageControl样本优化

时间:2011-12-02 01:25:37

标签: ios uiscrollview

我正在尝试为iOS Developer PageControl Sample实施建议的优化。这是我在PhoneContentController中使用的代码:

// A possible optimization would be to unload the views+controllers which are no longer visible
for (int i = 0; i < page-1; i++) {
    MyViewController *vc = [viewControllers objectAtIndex:i];
    if ((NSNull *)vc != [NSNull null]) {
        NSLog(@"Unloading page %d", i);
        [vc.view removeFromSuperview];
        vc.view = nil;
        [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
    }
}

for (int i = page+2; i < kNumberOfPages; i++) {
    MyViewController *vc = [viewControllers objectAtIndex:i];
    if ((NSNull *)vc != [NSNull null]) {
        NSLog(@"Unloading page %d", i);
        [vc.view removeFromSuperview];
        vc.view = nil;
        [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
    }
}

这似乎工作正常。但是我希望MyViewController中的viewDidUnload方法和dealloc方法一样。我在这两种方法中都放置了一个NSLog()调用:

 - (void)viewDidUnload
{
    NSLog(@"Page %d unloaded", pageNumber);
    [super viewDidUnload];
}

- (void)dealloc
{
    NSLog(@"Page %d destroyed", pageNumber);
    [pageNumberLabel release];
    [numberTitle release];
    [numberImage release];

    [super dealloc];
}

似乎只调用了dealloc。这是输出:

2011-12-02 01:13:38.829 PageControl[3560:207] Unloading page 0
2011-12-02 01:13:38.831 PageControl[3560:207] Page 0 destroyed
2011-12-02 01:13:39.597 PageControl[3560:207] Unloading page 1
2011-12-02 01:13:39.598 PageControl[3560:207] Page 1 destroyed
2011-12-02 01:13:40.437 PageControl[3560:207] Unloading page 2
2011-12-02 01:13:40.437 PageControl[3560:207] Page 2 destroyed

我的问题是:为什么不调用viewDidUnload?

模拟低内存警告没有任何区别。

我按如下方式插入了NSLog语句:

if ((NSNull *)vc != [NSNull null]) {
    UIView *vw = vc.view;
    NSLog(@"1.vw[%d] -> %d", i, [vw retainCount]);
    [vc.view removeFromSuperview];
    NSLog(@"2.vw[%d] -> %d", i, [vw retainCount]);
    vc.view = nil;
    NSLog(@"3.vw[%d] -> %d", i, [vw retainCount]);
    [viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
    NSLog(@"4.vw[%d] -> %d", i, [vw retainCount]);
}

retainCount从3开始。在从superview中删除vc.view后,它保持在3。 vc.view设置为nil后,它降至2。从viewControllers数组中删除vc后,它保持在2。

我的问题是(仍然):为什么不调用viewDidUnload?

提前致意并表示感谢

1 个答案:

答案 0 :(得分:0)

来自viewDidUnload的{​​{3}}参考

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   记忆。在视图控制器的视图之后调用此方法   已经发布,你有机会进行任何最后的清理工作。

viewDidUnload仅在系统从内存中删除这些视图时才会发生。如果您在“硬件”菜单下的模拟器上发出内存警告,则会触发这些方法。