Objective C 中 NSArray、NSDictionary 等类的可变和不可变版本背后的逻辑是什么?

2024-04-19

为什么 Objective C 中常见的集合类(如 NSString、NSArray、NSDictionary 等)有可变版本和不可变版本。分别定义它们背后的逻辑是什么?性能、内存管理还是其他什么?


类的不可变版本之所以存在,是因为不可变对象本身就是一个特定状态的唯一标识符。 IE。如果你有一个NSArray of 100 NSString实例,即NSArray对于这些字符串中的任何一个,实例都可以被视为幂等。

同样,不变性意味着状态出售后不能发生更改。例如,NSView's subviews方法返回一个不可变的数组,从而确保调用者不会用内容玩游戏(甚至也不希望能够)。在内部,NSView could选择返回包含子视图(因为它内部可变)的[可能] NSMutableArray 和类型转换NSArray意味着调用者无法在没有邪恶转换或错误编译器警告的情况下操纵内容。 (顺便说一句,这可能是也可能不是真正的实现——但这种模式在其他地方使用)。

不变性还意味着可以进行枚举和/或遍历,而不会产生中间状态变化的风险。类似地,许多不可变类也是显式线程安全的;任意数量的线程可以同时读取不可变状态,通常不需要锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective C 中 NSArray、NSDictionary 等类的可变和不可变版本背后的逻辑是什么? 的相关文章

随机推荐

  • 这个文件格式叫什么

    我需要解析以下格式的文件 General Description Some Text Version 4 ProjType 1 Configurations Mice BuildOutputs BuildProject OutputFile
  • 更改背景颜色

    好吧 我对 vim 还很陌生 我不知道如何更改背景颜色 我正在编辑 vimrc 文件来设置这些颜色 但找不到任何背景颜色 我正在使用一个配色方案 我只需要知道如何覆盖它或者要查找什么 以便我可以在我的 color theme vim 文件中
  • 如何让 NSView 不裁剪其边界区域?

    我在 Xcode 上为 OS X 创建了一个空的 Cocoa 应用程序 并添加了 void applicationDidFinishLaunching NSNotification aNotification self view NSVie
  • Android Studio 布局编辑器无法渲染自定义视图

    在 Android Studio 中 布局编辑器无法预览 xml 中的自定义视图 非常简单的例子 public class MyCustomView extends FrameLayout public MyCustomView Conte
  • 使用 Lucene 进行精确短语搜索?

    我正在使用 SpanTerm Query 在 lucene 中搜索确切的短语 但这似乎不起作用 这是我的代码 Indexing IndexWriter writer new IndexWriter dir new StandardAnaly
  • 预计结构位于 的左侧。或 .* 但它是一个结构

    我收到编译错误structure required on left side of or on chest contents 0 but chest是一个结构 class Item public int id int dmg class C
  • 将JSON键值对绑定到polymer dart中的表模板

    如何以聚合物表示法绑定到 json 对象内的键 值对 我有模板重复 jsonarray中的对象 我想布置一个表格 假设每个对象有 1 一 2 二 3 三 就像是
  • Python 线程模块导入失败

    我正在尝试导入线程模块 但是 我似乎只是无缘无故地收到了错误 这是我的代码 import threading class TheThread threading Thread def run self print Insert some t
  • 是否可以引用 styles.xml 文件中的属性?

    我想让用户能够切换整个应用程序的颜色皮肤 我的意思是当用户按下屏幕上的按钮时动态切换应用程序的某些自定义视图的样式 我知道如果你打电话Activity setTheme before onCreate 方法 您可以动态更改应用程序的主题 但
  • 循环调用lambdaify,避免显式调用

    我有这个代码 var a b c arr np array 1 2 3 4 5 6 7 8 9 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 y np hsplit arr len var newdict for
  • Django,如果使用原始 SQL,我应该采取哪些步骤来避免 SQL 注入攻击?

    我读到 ORM 应该最大限度地减少 SQL 注入攻击的可能性 然而在 Django 中 有时 ORM 受到一定限制 我需要使用原始 SQL 我应该采取哪些步骤来避免 SQL 注入攻击 目前我知道检查查询字符串中的分号 但除此之外就不知道了
  • 通过ARM模板提供经典云服务

    在我们的一个项目中 我们正在尝试在 Azure 上自动部署云组件 对于大多数组件 基本上所有 ARM 组件 如 Redis 服务总线 应用服务等 我们能够使用 ARM 模板和 Powershell 脚本来实现它 然而 我们却陷入了困境云服务
  • List.filter 中的下划线

    为什么这不起作用 List true false filter size 错误说
  • Ruby:未初始化常量 Log4r::DEBUG (NameError) 问题

    使用时log4r在 Ruby 中 我编写了一个类似于以下内容的配置文件 require rubygems require log4r require log4r outputter datefileoutputter SERVICE LOG
  • 单例模式 - 早期绑定(涉及静态变量)是否会减少互斥锁的需要?

    他们说早期绑定解决了同步问题 我无法理解 如何 这是 Java 的特殊之处还是 C 也同样适用 那么 使用这种方法我们实际上不需要互斥锁 JVM 确保每个类都已完全加载 然后才允许通过其他线程对其进行任何访问 这意味着所有静态变量 包括un
  • 发送一系列命令并等待响应

    我必须更新连接到串行端口的设备上的固件和设置 由于这是通过一系列命令完成的 因此我发送命令并等待收到答案 在答案 多行 中 我搜索一个字符串 该字符串指示操作是否成功完成 Serial gt write boot 1000 Serial g
  • C# 中的图像处理库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 从哪里可以获得 C Net 中的图像处理库 edit 在这里查看列表https github com quozd awesome dotn
  • 使用 ConcurrentHashMap 避免空指针异常

    我知道这个问题已被问过多次 但我没有找到该问题的正确答案 从 ConcurrentHashMap 获取结果时如何避免抛出 NullPointerException 我有下面的代码 它向我抛出一个空指针 public static Strin
  • Python C Api 将 PyObject * 传输到 c 数组中

    我使用 python c api 并希望从 python 返回一个数组 我从 python 端返回了一个 python 数组 并希望将 PyObject 结果传输到一个 c 数组中 以便我可以使用它 我能做到吗 附带问题 在什么情况下尝试返
  • Objective C 中 NSArray、NSDictionary 等类的可变和不可变版本背后的逻辑是什么?

    为什么 Objective C 中常见的集合类 如 NSString NSArray NSDictionary 等 有可变版本和不可变版本 分别定义它们背后的逻辑是什么 性能 内存管理还是其他什么 类的不可变版本之所以存在 是因为不可变对象