HashTables / HashMaps是现有数据结构中最常用的(如果不是 )之一。因此,在开始学习Cocoa编程时我研究的第一件事就是如何从哈希表中创建,填充和读取数据。
令我惊讶的是:我在Cocoa / Objective-C编程上阅读的所有文档似乎都没有解释这么多。作为一个使用“java.util”的Java开发人员,好像它是一个身体功能:我完全被这个困惑了。
所以,如果有人可以为我提供创建,填充和阅读哈希表内容的入门知识:我将非常感激。
答案 0 :(得分:58)
NSDictionary和NSMutableDictionary?
这是一个简单的例子:
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setObject:anObj forKey:@"foo"];
[dictionary objectForKey:@"foo"];
[dictionary removeObjectForKey:@"foo"];
[dictionary release];
答案 1 :(得分:12)
您可以尝试使用NSHashTable!
答案 2 :(得分:8)
如果您正在使用Leopard(以及Cocoa的新垃圾收集),您还需要查看NSMapTable。
答案 3 :(得分:7)
除了NSDictionary之外,还要检查NSSet,了解何时需要没有订单且没有重复的集合。
答案 4 :(得分:2)
使用iOS 6.0+ SDK中的NSHashTable。 哈希表是在NSSet之后建模的,具有以下差异: 它可以容纳对其成员的弱引用。 其成员可以在输入上复制,也可以使用指针标识进行相等和散列。 它可以包含任意指针(其成员不限于对象)。
NSHashTable *hashTable = [NSHashTable
hashTableWithOptions:NSPointerFunctionsCopyIn];
[hashTable addObject:@"foo"];
[hashTable addObject:@"bar"];
[hashTable addObject:@100];
[hashTable removeObject:@"bar"];
NSLog(@"Members: %@", [hashTable allObjects]);
使用iOS 6.0+ SDK中的NSMapTable。 映射表以NSDictionary为模型,具有以下差异: 键和/或值可选地保持“弱”,以便在回收其中一个对象时移除条目。 其键或值可以在输入上复制,也可以使用指针标识进行相等和散列。 它可以包含任意指针(其内容不限于对象)。
id delegate = ...;
NSMapTable *mapTable = [NSMapTable
mapTableWithKeyOptions:NSMapTableStrongMemory
valueOptions:NSMapTableWeakMemory];
[mapTable setObject:delegate forKey:@"foo"];
NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);