【发布时间】:2012-10-18 14:35:30
【问题描述】:
我有一个应用程序在滚动视图中加载了许多视图控制器,具体取决于用户在表格视图中拥有的对象数量。因此,当我在 tableview 和滚动视图之间切换时,滚动视图中的视图控制器数量会根据用户在 tableview 中拥有的对象数量而变化。
我使用 Apple 的 PageControl 示例代码中的代码来构建滚动视图,其中包含许多视图控制器,当然经过一些修改。
- (void)loadScrollViewWithPage:(int)page
{
if (page < 0) return;
if (page >= kNumberOfPages) return;
// replace the placeholder if necessary
MainViewController *countdownController = [viewControllers objectAtIndex:page];
if ((NSNull *)countdownController == [NSNull null])
{
id occasion = [eventsArray objectAtIndex:page];
countdownController = [[MainViewController alloc] initWithPageNumber:page];
[countdownController setOccasion:occasion];
[viewControllers replaceObjectAtIndex:page withObject:countdownController];
[countdownController release];
}
// add the controller's view to the scroll view
if (nil == countdownController.view.superview)
{
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
countdownController.view.frame = frame;
[scrollView addSubview:countdownController.view];
}
}
问题是当我在表格视图和滚动视图(根据 Instruments)之间切换时,活动视图控制器(此处为 MainViewController)的数量不断增加,即使我没有添加任何会导致内存问题的新对象.
我在滚动视图的 viewWillDisappear 中尝试了很多东西,例如:
- (void) viewWillDisappear:(BOOL)animated
{
//test unloading all views
//Remove all subviews
[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
//[[scrollView subviews] makeObjectsPerformSelector:@selector(release)];
//[viewControllers removeAllObjects];
for (unsigned m = 0; m < [viewControllers count]; m++)
{
//[[viewControllers objectAtIndex:m] makeObjectsPerformSelector:@selector(release)];
[viewControllers removeObjectAtIndex:m];
}
}
但它没有用。 这是该应用程序如何工作的记录 youtube.com/watch?v=5W8v_smZSog
这是滚动视图的 viewWillAppear 方法:
- (void)viewWillAppear:(BOOL)animated
{
eventsArray = [[NSMutableArray alloc] init];
kNumberOfPages = [self.dataModel occasionCount];
//update the eventsArray from the dataModel
//Fill in the events Array with occasions form the data model
for (unsigned r = 0; r < kNumberOfPages; r++)
{
Occasion* occasion = [self.dataModel occasionAtIndex:r];
[eventsArray insertObject:occasion atIndex:r];
}
// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];
// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = currentPage;
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
更新:仪器视频录制http://www.youtube.com/watch?v=u1Rd2clvMQE&feature=youtube_gdata_player
以及显示负责呼叫者的屏幕截图:
谢谢。
【问题讨论】:
-
我认为将视图控制器视图放在表格视图中是不寻常的——使用普通的
UITableViewCells 怎么样? -
我没有将视图控制器放在表格视图中,而是放在滚动视图中。这些视图控制器的数量取决于表格视图中的数据。
-
同样的概念也适用.. 为什么不加载一组视图并将它们放在滚动视图中呢?你设置它,这样你就有一个拥有滚动视图和子视图的视图控制器。
-
这就是我正在做的,它工作正常。问题是我释放视图控制器后内存没有释放。我通过检查实时视图控制器的数量和不断增加的内存在仪器中验证了这一点。
-
代码是多少?我在 2 天内将一个大项目移至 ARC。
标签: ios memory uiviewcontroller uitableview scrollview