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

2024-04-03

我知道 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(使用前将#替换为@)

NSCell 与 NSView:当需要许多控件时 的相关文章

  • 二元运算符“/”不能应用于两个(Int)操作数[重复]

    这个问题在这里已经有答案了 我得到了Binary operator cannot be applied to two Int operands当我将以下代码放入 Xcode 中的 Swift Playground 时出错 func sumO
  • 如何使用 Swift 将“完成”按钮添加到 iOS 中的数字键盘?

    它在默认键盘上工作得很好 但我无法让它在数字键盘上工作 有任何想法吗 据我所知 你不能在键盘部分添加 完成 按钮 你应该添加一个inputAccessoryView to the UITextField or UITextView 如果这就
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • 从plist文件中读取数据

    我正在尝试为我的 iPhone 应用程序实现保存状态 我有一个名为 SaveData plist 的 plist 文件 我可以通过以下方式读取它 NSString pListPath2 bundle pathForResource Save
  • 为什么在迭代字典时会出现“类型 [object] 的值没有成员 'lowercaseString'” 错误? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有几个对象 Struct object var title String var one object green v
  • 为什么 Objective-C 方法名称的最后一部分必须带有参数(当有多个部分时)?

    在 Objective C 中 您不能声明最后一个组件不带参数的方法名称 例如 以下内容是非法的 void take id theMoney andRun void take id yourMedicine andDontComplain
  • 更改导航项(栏)的背景颜色

    有没有一种简单的方法可以更改视图顶部导航项的背景颜色 我有一个基于导航的应用程序 我只希望一个视图获得另一种背景颜色 我主要使用 IB 创建视图 我找到了以下解决方案 未测试 float r 10 float g 55 float b 13
  • 删除派生数据文件夹后,Xcode 不断重新创建派生数据文件夹

    自动完成功能在 Xcode 6 中不再起作用 我四处搜索 发现删除派生数据文件夹可以解决此问题 每次我删除它时 它都会回来 然后就不会再自动完成了 有什么建议么 Thanks 没关系 我解决了这个问题 我没有声明需要在类内的方法中使用的变量
  • Objective-C 中是否有命名初始化方法的约定?

    在可以通过不同的 init 方法初始化的 Objective C 类中 将所有初始化程序共用的初始化代码收集到一个从其他 init 方法 有时也从从 Nib 唤醒 是否有关于如何命名该方法的约定 初始化器 初始化公共 根据 Apple 的说
  • 如何右对齐 UILabel?

    Remark 实施 myLabel textAlignment right does not解决了我的问题 这不是我所要求的 我想要实现的是让标签对齐右对齐 为了更清楚地说明 这就是如何left对齐外观 就是这样justify对齐外观 if
  • Swift 中的柯里函数

    我想创建一个返回柯里函数的函数 如下所示 func addTwoNumbers a Int b Int gt Int return a b addTwoNumbers 4 b 6 Result 10 var add4 addTwoNumbe
  • Objective-C:int值无故改变

    Objective C 我需要帮助保留 int 的值 无需我的命令 它就在我身上发生变化 最初的问题是 如何声明和保留 int 这在另一篇文章中得到了满足 Objective C 如何声明和保留 int https stackoverflo
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • 高效创建 x 层深度的嵌套 for 循环

    这可能是一件简单的事情 但我需要创建一个循环结构 使其循环 y x 次以创建 x 和 y 的所有可能组合 例如 如果有 4 个 x 每个 x 有 2 个 y 我想做这样的事情 for int a 0 a lt y a for int b 0
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 将 UIButton 中的图像缩放到 AspectFit?

    我想将图像添加到 UIButton 并且还想缩放图像以适合 UIButton 使图像变小 请告诉我该怎么做 这是我尝试过的 但它不起作用 将图像添加到按钮并使用setContentMode self itemImageButton setI
  • 从 cocoa 编辑系统偏好设置

    有没有办法使用可可以编程方式编辑系统首选项 是否需要一些框架 我需要这样做来更改全局代理设置 另外 我的应用程序是沙盒的 有关于如何执行此操作的示例代码吗 感谢您的帮助 您正在寻找系统配置框架 但这并不容易 我认为沙盒应用程序不可能这样做
  • 获取 Mojave 上的鼠标坐标

    我有一个非常基本的小命令行应用程序 可以在下次单击鼠标时获取鼠标坐标 import

随机推荐