我正在尝试为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?
提前致意并表示感谢
答案 0 :(得分:0)
来自viewDidUnload
的{{3}}参考
当出现内存不足的情况和当前视图控制器时 如果不需要视图,系统可能会选择从中删除这些视图 记忆。在视图控制器的视图之后调用此方法 已经发布,你有机会进行任何最后的清理工作。
viewDidUnload仅在系统从内存中删除这些视图时才会发生。如果您在“硬件”菜单下的模拟器上发出内存警告,则会触发这些方法。