UITableView numberOfSectionsInTableView和numberOfRowsInSection在初始加载时调用三次

我正在做一个没有任何数据源的REALLY BASIC UITableView项目。 我只在第一个和唯一的单元格上显示“1”。

我在numberOfSectionsInTableViewnumberOfRowsInSectionreturning 1 。 我也做了一个NSLog的两个方法简单地说明各自的方法的名称。

在初始加载时,我得到这个:

 SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section SomeShit[27511:936083] number of sections SomeShit[27511:936083] number of rows in section 

为什么这些方法调用三次? 纠正我,如果我错了,但这真的很奇怪。 我以为他们应该只打一次,因为在这两个项目的数量是1。

编辑:

我在做什么viewDidLoad

 self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain]; [self.view addSubview:self.tableView]; self.tableView.dataSource = self; self.tableView.delegate = self; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; 

委托和数据源在那里为表视图实现提供服务,并且可以多次调用方法。 你不应该关心表视图的实现细节,只要确保你的答案是一致的(即你可以在任何时候正确地回答,没有调用reloadData就不会改变答案)。

在文档中没有任何地方说这些方法只在重载数据周期中调用一次。

你已经假设他们只需要被调用一次,但正如你所表明的那样,这是一个不好的假设。

在审查了UITableViewUITableViewDataSource的文档后,唯一的承诺是这样的。

-[UITableView numberOfSections]

讨论

UITableView从数据源中获取这个方法返回的值并caching它。

这意味着你不知道如何调用-[UITableView numberOfSections]将与调用-[UITableViewDataSource numberOfSectionsInTableView:]相对应。

更糟的是,这些方法被调用的次数可以(并且)在不同版本的iOS之间改变。


简而言之,使这些方法是幂等和高性能的 ,忘记了UITableView实现细节。

你可以尝试找出是什么导致这些重新加载。 转到断点(1),按“加”button(2)。 然后在“symbol”字段中添加符号断点 – [UITableView reloadData]。 在这里输入图像说明在这里输入图像说明

然后运行您的应用程序并查看方法调用的堆栈跟踪。 你将能够找出这种行为的原因。

在这里输入图像说明