NSCell vs NSView:当需要许多控件时

时间:2014-11-28 13:54:17

标签: objective-c cocoa swift nscell

我知道Apple正在弃用NSCell而使用NSView(参见AppKit 10.10发行说明)。之前建议在需要许多控件时出于性能原因使用NSCell

我花了相当多的时间来实现需要许多子视图的自定义控件,并且使用NSView类型的子视图的性能并不好。请参阅related stackoverflow discussion 您在窗口中可以拥有的NSView类型实例数量的实际限制是什么?我正在努力处理1000-2000个内存中的对象(它没有&#39 ;似乎很多)。 此限制的实际原因是什么?

令我困惑的一件事是基于视图的Cocoa NSTableViews。您可以创建超过1000-2000个单元格的tableViews,它们的加载和滚动性能似乎不佳? 如果每个单元格都是NSView,那么这是如何实现的?

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

此外,(可能已过时的)Apple开发人员指南对NSView&我需要进一步解释的NSCell:

"因为细胞比对照更轻,就遗传数据和行为而言,使用多细胞控制而不是多个控制更有效。"

继承的数据:这肯定只会导致"膨胀"如果正在使用数据=>它只会在你需要的时候使用吗?

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

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

2 个答案:

答案 0 :(得分:3)

  

令我困惑的一件事是基于视图的Cocoa NSTableViews。您可以创建超过1000-2000个单元格的tableViews,它们的加载和滚动性能似乎不佳?如果每个单元都是NSView,那么这是如何实现的呢?

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

答案 1 :(得分:1)

简短而不完整的答案:

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

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

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