iPhone开发:有哪些可用的数据结构?

8

这是一个非常新手的问题,但是iPhone API提供了任何数据结构来使用吗(例如链表、哈希映射等)?


请注意,NS(Mutable)Array不一定在C风格的数组中存储对象指针。它会根据您的使用方式动态更改其内部表示形式,包括C风格数组、链表和任何其他结构。 - Jack Lawrence
3个回答

18
您可以使用在C或C++中实现的任何数据结构与iPhone SDK一起使用。
例如,我经常使用标准库
此外,您还可以使用Cocoa提供的复杂数据结构,如:
  1. NSArray
  2. NSDictionary(哈希)
  3. NSSet(集合)
您可以在此处找到有关它们的伴随文档这里

13
技术性:Objective-C本身并不提供这些类——它们是Cocoa的一部分。Objective-C只是所使用的语言。虽然这不是什么大问题,但养成正确地引用这些东西的习惯是个好主意。 ;) - hbw
1
同意。我会修改我的答案以反映你所说的内容。谢谢! - Pablo Santa Cruz

12
Cocoa(Mac和iOS上都可用的框架)实现了几种常见的集合类型,包括NSArrayNSDictionaryNSSet,以及它们的可变版本。(Leopard还引入了NSPointerArrayNSHashMapNSHashTable,这是一组带有附加选项的数组/字典/集合(如使用弱引用),使它们在垃圾收集环境中使用起来非常方便。但是,这些类目前在iPhone上不可用,并且目前没有太大意义,因为iOS不支持垃圾回收。)这些类非常快速,并适用于任何Cocoa应用程序的通用用途。

除了这些提供的结构外,您有几个选择:(1)使用这些作为构建块创建更复杂的结构,(2)利用现有的第三方代码,或者(3)从头开始构建自己的数据结构。

一种选择是CHDataStructures.framework,这是一个我维护的开源Objective-C框架。它实现了其他常见的数据结构,如栈/队列/双端队列、链表、排序集等。这些结构采用NSCodingNSCopying(加上10.5+的NSFastEnumeration),因此它们可以与本地Objective-C代码无缝配合使用。该项目还允许您构建用于iPhone的静态库。由于这个框架是开源的,如果需要,甚至可以直接将相关代码包含在您的项目中。

虽然您可以使用C++和STL结构,但我发现混合使用Objective-C和C++往往更加令人困惑,并导致难以解决的错误,尤其是对于新手。这并不是对C++的抨击,只是一个“入乡随俗”的原则。当使用C++时,STL当然是首选方法。如果您已经混合使用了C++,那么您可能足够熟悉它,STL可能是一个不错的选择;即使如此,我发现使用本地Cocoa集合会产生更加自明、可读性更高的代码。


3
如果那些感觉需要点踩的人能留下一些反馈,说明他们为什么认为回答“没有帮助”,那就太好了。 - Quinn Taylor
1
我不相信在iPhone上可以使用NSHashMap、NSHashTable或NSPointerArray。 - Carl Coryell-Martin
1
Carl是正确的,由于我在SO上没有找到这些信息,因此我想清楚地说明:NSHashMap、NSHashTable和NSPointerArray在iPhone SDK中不可用。请参阅此问题,了解如何使用NSValue来封装指针: https://dev59.com/6EbRa4cB1Zd3GeqPxBVJ - Felixyz
唉...那个链接是错的,但是重点是:使用NSValue来包装指针并将它们放入Cocoa集合中。 - Felixyz
我很难找到“NSHashMap”; 难道不应该是“NSMapTable”吗? - PLG

-4

Objective-C语言本身不提供任何类似于链表等的内置数据结构。然而,由于它基于C/C++代码库,因此可以直接在Objective-C中实现C或C++中可以实现的任何内容,包括链表和其他数据结构。


3
Objective-C并非基于C++代码库而言。它确实基于C语言,但要使用任何C++功能,你必须费尽心思(并有点受罚)。 - Mike Abdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接