我知道,苹果反对使用NSCell,而改用NSView (参见AppKit 10.10发布说明)。以前曾建议在需要许多控件时,出于性能原因使用NSCell。
我花了相当长的时间来实现一个需要很多subViews的自定义控件,而且使用NSView类型的subViews的性能也不是很好。请参阅related stackoverflow discussion ,您可以在窗口中拥有的NSView类型实例的实际限制是什么?I正在与1000-2000内存对象进行斗争(这似乎不是很多)。这个限制的实际原因是什么?
有一件事让我对上面的观点感到困惑:基于视图的可可NSTableViews。您可以使用1000-2000单元创建tableViews,而且它们的加载和滚动性能似乎并不差?如果每个单元格都是NSView,那么这是如何实现的?
如果有实际的限制,那么当他们说他们反对使用NSCell的时,他们在想什么呢?我相信他们知道一些控件需要大量的subViews。
此外,(可能已经过时的) Apple指南对NSView和NSCell之间的区别给出了以下解释,我需要进一步解释:
由于细胞的重量比控制的轻,在遗传数据和行为方面,使用多细胞控制比使用多个控制更有效。
继承的数据:这肯定只会导致“膨胀”,如果数据是使用=>和它只会使用,你需要它吗?
继承行为:没有在类/对象中使用的方法肯定不会造成任何开销?
,轻量级NSCell和重量级NSView之间的真正区别是什么,除了它似乎只是常规地被接受之外?(我真的很想知道)。
发布于 2015-12-11 19:44:49
有一件事让我对上面的观点感到困惑:基于视图的可可NSTableViews。您可以使用超过1000-2000个单元来创建tableViews,而且它们似乎没有很差的加载和滚动性能?如果每个单元是一个NSView,那么这是如何实现的?
NSTableViews重用视图.唯一实际生成的视图是那些可见的视图,再加上上面的一行视图和可见区域下面的一行视图。当滚动表时,与给定视图行关联的对象值将更改为该行中的视图将显示不同的内容。
发布于 2015-03-05 17:06:16
简短而不完整的回答:
NSCells是关于绘图状态的,而不是其他的。NSViews必须绘制,但也必须维护和更新各种其他信息,如它们的布局、响应用户输入事件等。
如果调整包含数百个子视图的视图的大小,则必须考虑计算量:必须根据视图布局的现有约束来维护每个子视图的位置和大小。光是这一点很快就会产生大量的处理。
相反,NSCells并不以这种方式存在于布局中。他们唯一的工作是在给定的矩形中绘制信息。
https://stackoverflow.com/questions/27190183
复制相似问题