【发布时间】:2017-11-02 06:42:58
【问题描述】:
我正在做一些研究以获取 tableview 委托方法的确切执行顺序。
案例 1:行数 - 用于小值
所以首先我创建了100 行并发现执行流程如下。
- numberOfSectionsInTableView
- numberOfRowsInSection
- cellForRowAtIndexPath
案例 2:行数 - 超过 Int 限制
我尝试返回大于 int 限制的值
然后发现抛出异常。效果很好。
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Failed to allocate data stores for 402337200000000 rows in section 0.
Consider using fewer rows'
案例 3:行数 - Int 值但更高
之后,我将行数更改为 4023372000000 一个理想值,但确认返回类型为 Int。
当时需要超过 5 分钟,并且任何委托方法都在崩溃后被调用。在 cellForRowAt 被调用之前卡住了。我的系统也卡了这么长时间。崩溃时没有日志。
卡住时的内存使用情况
内存使用率变高
可用空间= -50GB(也使用我的系统内存) 使用百分比 = 600%
如果他们确定它会崩溃,那么这个范围应该包含在异常情况中。
那段时间他们有没有做其他事情?
在第 3 种情况下,编译器正在执行其他操作,并且“只有要在屏幕中显示的单元格才会为 tableview 加载”的概念失败。
【问题讨论】:
-
只是 CPU 在表格视图中加载如此数量的单元格并导致崩溃和挂起系统。由于我的代码中存在无限循环,我也遇到了系统崩溃问题。所以,表视图委托和数据源方法没有问题。
-
单元格将根据屏幕右侧的可用空间进行加载。那么为什么CPU会变高
-
@Saranjith 你在重复使用单元格吗?
-
@TusharSharma 是重复使用带有标识符的单元格
-
在“numberOfRowsInSection”方法中使用断点。它也被调用 n 次(n = numberOfrowsinSection)。它在这种方法中崩溃了,这就是为什么不调用 cellForRowAtIndexpath 的原因。
标签: ios swift uitableview delegates