【问题标题】:What is the most reliable and fastest type or data structure to store data using Objective C?使用 Objective C 存储数据的最可靠和最快的类型或数据结构是什么?
【发布时间】:2015-06-20 09:22:06
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c nsarray nsdictionary nsset


    【解决方案1】:

    这仅取决于您希望如何添加、存储和删除这些数据。

    首先让我们了解一下 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

    【讨论】:

    • 由于它对具有不同功能的不同类型进行了非常精彩的描述(对每个用户都有很好的解释/提醒),关于实时性能的问题仍然存在。例如,一个很好的比较,但仅限于 NSData 和 NSArray 之间:iwantmyreal.name/blog/2012/09/29/a-faster-array-in-objective-c
    • 感谢@DariusMiliauskas,非常感谢!我添加了一篇关于上述每种数据结构的性能特征的文章。请看一下。
    • 精彩的答案。感谢分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多