使用 Objective C 存储数据的最可靠和最快的类型或数据结构是什么?

What is the most reliable and fastest type or data structure to store data using Objective C?

我正在寻找类型或数据结构来在我的应用程序(Mac OS X 或 iOS)上存储大量相同类型的基元,使用 Objective C.据我了解,NSNumber 仅存储一个原语(如果我错了请纠正我)。比方说,我有数千个整数或字符串。 在其中放置、存储和访问它们的最佳解决方案是什么? NSSet、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary 还是其他?我知道它们有不同的特性,但我基本上只关心基本操作(放置、存储、检索)的性能。

这仅取决于您想如何添加、存储和删除此数据。

首先让我们来看看在Objective-C中可用的每种数据结构类型:

原始数组

这是Objective-C(或C)中最基本的存储类型,用于存储原语。 例如:int a[4] = {1, 2, 3, 4}; 对此的限制是

  • 只能存储原始类型。
  • 数组大小一旦声明就不能改变。
  • 只能通过其索引检索。
  • 只能存储在声明数组时定义的单一类型的数据。

NSArray

这是一个用来存放物品的容器。 NSObject 类型(或从 NSObject 继承)或 'id' 类型的任何对象都可以存储在 NSArray.

  • 一旦初始化,它就不能改变,即不能改变数组大小,也不能修改它包含的对象。这在安全方面是好的。
  • 对象只能通过其索引访问。

NSMutableArray

NSArray相同,但

  • 可以改变,即可以修改现有对象,也可以添加或删除新对象。

NSSet

NSArray相同,但

  • 仅存储唯一对象。
  • 无法通过其索引访问对象。只能通过枚举访问对象。

NSMutableSet

NSSet相同,但

  • 可以改变,即可以在以后添加或删除对象。

NSOrderedSet

NSArray相同,即对象通过索引存储和检索,但是

  • 仅存储唯一对象。

NSMutableOrderedSet

NSMutableArray相同,但

  • 仅存储唯一对象。

NSDictionary

可以存储任何类型的数据。

  • 对象通过键存储和检索。
  • 一旦初始化,就不能改变,即不能添加新的键值,也不能更新与特定键关联的现有对象。

NSMutableDictionary

NSDictionary

相同
  • 可以改变,即可以添加或删除新对象,也可以修改现有对象。

这是对 Objective-C 中最常用的数据结构的简短描述。这些是根据程序的需要以及如何操作数据来使用的。

因此,

  • 如果您想存储数以千计的数字和字符串并希望通过其索引值访问它们,请使用 NSMutableArray。如果您以后不打算添加、删除或修改任何对象,请使用 NSArray.
  • 如果你想存储数据但不想重复并且想通过它的索引访问它使用NSOrderedSet/NSMutableOrderedSet
  • 如果你想存储数据但不想重复并且它的顺序也不重要那么使用NSSet/NSMutableSet.
  • 如果您想通过特定的 key 访问数据,请使用 NSDictionary/NSMutableDictionary

关于性能

  • 由于 NSSet 不包含任何顺序,因此它们比 NSArray
  • 更高效
  • Here 是一篇关于上面讨论的每个数据结构的性能特征的非常好的和详细的文章

    Class                      Time [ms]    1,000,000 elements
    

    添加

    NSMutableOrderedSet         3190.52
    NSMutableDictionary         2522.47
    NSMutableSet                2511.96
    NSMutableArray              1423.26
    NSSet                          8.03
    

    随机访问

    NSMutableOrderedSet           10.74
    NSMutableDictionary            9.18
    NSMutableArray                 8.08
    NSMutableSet                   4.47
    NSSet                          3.56
    

要了解有关 Objective-C 数据类型和数据结构的更多信息,请阅读 this