【问题标题】:C array vs Obj-C arrayC 数组 vs Obj-C 数组
【发布时间】:2011-03-07 23:22:17
【问题描述】:

在 Objective-C 中使用 alloc init 创建数组时,当对象被添加到数组中时,内存是如何管理的?

我想知道当您创建数组和 malloc 时这与 C 有何关系,分配的大小需要是预期数组的大小,或者需要重新分配数组内存。

这些是如何关联的,或者什么是理解 C 代码工作方式的好方法。

添加对象时是否会在内部处理 Objective-c 数组内存,或者这是如何工作的?

【问题讨论】:

  • 在 NSArray 中究竟如何处理内存是一个实现细节——也就是说,没有一个正确的答案。它可能因编译器、版本、运行时库、操作系统等而异。也就是说,很可能通过 malloc()。
  • 关于您可以几乎肯定地说的唯一一件事是 NSArray 将使用比 C 数组更多的内存(您为这些功能付费),但添加项目的增量成本可能更便宜NSArray 作为整个数组不会被重新分配,这对于 C 数组来说是可能的(但不确定)。
  • @CRD:NSArray 是不可变的。您不能就地添加项目。
  • @Seva:是的,我的意思是NSMutableArray,当然,关于向数组添加项目的问题。

标签: objective-c c arrays malloc


【解决方案1】:

Objective-C 数组遵循与其他 Objective-C 对象相同的内存管理规则。如果你分配它,你需要释放它。

C 数组和 Objective-C 数组在概念上相似,但实现方式却大不相同。 C 数组是一个连续的内存块,除了控制如何使用它的语言结构外,几乎没有其他内容。 Objective-C 数组是具有重要内置功能的对象。它们会动态调整自己的大小(如果它们是可变的)以适应添加的元素。他们正确地保留和释放他们存储的对象。它们可以自行排序、过滤、插入对象、删除对象等。您不应假设它们是如何实现的。

Apple 的文档应该让您更好地了解 Objective-C 数组的可能性(当您使用它时,也请查看其他集合类)。从这里开始阅读: Collections Programming Topics

【讨论】:

    【解决方案2】:

    NSArrays(以及扩展的 NSMutableArrays)保留添加到它们的对象,并在数组本身被释放时向它们发送所有释放消息。

    这样的结果是一个常见的模式是分配一个对象,初始化它,把它交给数组,然后释放它。由于数组为自己保留它,它会持续与数组本身一样长,或者直到您指示数组摆脱它。您永远不需要再发送一条发布消息,数组机制会处理这些。

    我猜 Mutable 数组被实现为类似于链表的东西,因此它们可以在以后轻松扩展和收缩。它只是一个指针列表,也许还有一些元数据。由于它不创建任何交给它的对象,只是将它自己的皮带放在它们身上,它需要做的就是为指向对象的指针提供一个位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多