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

时间:2015-04-14 16:41:53

标签: ios objective-c nsarray nsdictionary nsset

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

1 个答案:

答案 0 :(得分:10)

它仅取决于您希望如何添加,存储和删除此数据。

首先,让我们浏览一下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
  • 如果您想通过特定密钥访问数据,请使用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