我知道 Apple 不赞成使用NSCell
赞成NSView
(请参阅 AppKit 10.10 发行说明)。此前曾建议NSCell
当需要许多控制时出于性能原因使用。
我花了相当多的时间来实现一个需要很多子视图的自定义控件,并且使用 NSView 类型的子视图的性能并不好。看相关的 stackoverflow 讨论 https://stackoverflow.com/questions/28392153/why-is-my-cocoa-nswindow-taking-such-a-long-time-to-become-active 窗口中可以拥有的 NSView 类型实例数量的实际限制是什么?我正在努力处理 1000-2000 个内存对象(看起来并不多)。这种限制的真正原因是什么?
上面让我困惑的一件事是基于视图的 Cocoa NSTableViews。您可以创建具有超过 1000-2000 个单元格的 tableView,并且它们的加载和滚动性能似乎并不差?如果每个单元格都是一个 NSView 那么这是如何实现的呢?
如果有实际限制,那么当 Apple 表示不再使用 NSCell 时他们在想什么?我确信他们知道某些控件需要大量子视图。
此外,(可能已经过时的)苹果开发人员指南对 NSView 和 NSCell 之间的差异给出了以下解释,我需要进一步解释:
“由于单元格比控件更轻,因此就继承的数据和行为而言,使用多单元格控件比使用多个控件更有效。”
继承的数据:如果正在使用数据,这肯定只会导致“膨胀”=>并且只有在您需要它时才会使用它?
继承行为:您不在类/对象中使用的方法肯定不会导致任何开销?
除了似乎被传统接受之外,轻量级 NSCell 与重量级 NSView 之间的真正区别是什么?(我真的很想知道。)
一个简短且不完整的答案:
NSCells 是关于绘制状态的,除此之外就没有什么了。 NSView 必须绘制,但也必须维护和更新各种其他信息,例如它们的布局、响应用户输入事件等。
考虑一下如果调整包含数百个子视图的视图的大小,则必须进行的计算量:必须根据视图布局的现有约束来维护每个子视图的位置和大小。仅此一项就需要大量的处理。
相比之下,NSCell 并不以这种方式存在于布局中。他们唯一的工作是在需要时在给定的矩形中绘制信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)