5

我知道 Apple 不赞成使用NSCellNSView请参阅 AppKit 10.10 发行说明)。以前建议NSCell在需要许多控件时出于性能原因使用。

我花了相当多的时间来实现一个需要许多子视图的自定义控件,并且使用 NSView 类型的子视图的性能并不好。请参阅相关的 stackoverflow 讨论 就一个窗口中可以拥有的 NSView 类型实例的数量而言,实际限制是什么?我正在努力处理 1000-2000 个内存对象(这似乎并不多)。这种限制的真正原因是什么?

上面让我感到困惑的一件事是基于视图的 Cocoa NSTableViews。您可以创建超过 1000-2000 个单元格的 tableViews,而且它们似乎没有很差的加载和滚动性能?如果每个单元格都是一个 NSView 那么这是如何实现的呢?

如果有实际限制,那么当 Apple 说他们不赞成使用 NSCell 时,他们在想什么?我确信他们知道某些控件需要大量的子视图。

此外,(可能已过时)Apple Developer Guide 对 NSView 和 NSCell 之间的区别给出了以下解释,我需要进一步解释:

“因为单元格比控件轻,就继承的数据和行为而言,使用多单元格控件而不是多个控件更有效。”

继承的数据:如果正在使用数据,这肯定只会导致“膨胀”=>并且只会在您需要时使用它?

继承的行为:您不在类/对象中使用的方法肯定不会造成任何开销?

轻量级 NSCell 与重量级 NSView 之间的真正区别是什么,除了它似乎被传统地接受? (我真的很想知道。)

4

2 回答 2

3

上面让我感到困惑的一件事是基于视图的 Cocoa NSTableViews。您可以创建超过 1000-2000 个单元格的 tableViews,而且它们似乎没有很差的加载和滚动性能?如果每个单元格都是一个 NSView 那么这是如何实现的呢?

NSTableViews 重用视图。实际生成的唯一视图是那些可见的,再加上可见区域上方的一行视图和可见区域下方的一行。滚动表格时,与给定视图行关联的对象值更改为该行中的视图将显示不同的内容

于 2015-12-11T19:44:49.367 回答
2

一个简短且不完整的答案:

NSCells 是关于绘制状态的,仅此而已。NSViews 必须绘制,还必须维护和更新各种其他信息,例如它们的布局、响应用户输入事件等。

考虑调整包含数百个子视图的视图大小时必须发生的计算量:必须根据视图布局的现有约束来维护每个子视图的位置和大小。仅此一项很快就会进行大量的处理。

相比之下,NSCell 不以这种方式存在于布局中。他们唯一的工作是在被要求时在给定的矩形中绘制信息。

于 2015-03-05T17:06:16.957 回答