2012-03-29 60 views
2

我需要一个在运行时使用的字符串 - >字符串映射(想想NSDictionary),除非映射在构建时间后永远不会改变。静态字符串 - >字符串映射

天真的解决方案是只使用NSDictionary,但必须有一个更优化的方式来做到这一点,不是吗?

最佳的意义在于,如果映射在编译时是已知的,并且从不改变,编译器应该能够在编译时进行映射。 NSDictionary需要在运行时进行哈希查找。我知道这是不变的时间,但它只是对我来说有点“不洁”...

+1

“更优化”是什么意思?你看到一些性能问题与NSDictionary,或者你只是假设必须有一个? – Caleb 2012-03-29 16:56:24

+0

更新我的问题以澄清我的意思是“最佳”。 – elsurudo 2012-03-30 15:58:09

+0

如果映射是“在运行时使用”,那么编译器如何根据第一句执行映射?你能解释一下你想解决的问题吗? – Caleb 2012-03-30 16:15:05

回答

1

静态NSDictionary是正确的工具。您通常使用的方法+initialize初始化这些:

static NSDictionary *kDictionary; 

+ (void)initialize { 
    if (self == [MYClass class]) { 
    kDictionary = [[NSDictionary alloc] initWith...]; 
    } 
} 

initialize被称为每班一次,与线程安全,之前在第一个请求方法被调用这个类的(通常这第一种方法是+alloc)。 self测试是因为子类将自动调用它们的[super initialize],并且在这种情况下您通常不希望多次运行这个测试。

+0

是否有任何理由不使用'dispatch_once()'警卫来进行初始化?这似乎更符合预期的限制,并且允许子类确保字典可用(如果其中一个在此类之前使用)。 – 2012-03-29 17:05:43

+0

你会把'dispatch_once()'放在哪里?你可以把它放在'init'中,但是如果这个对象是用'initWithCoder:'创建的呢?如果有依赖于字典的类方法,可能会在第一个'init'之前调用呢? '+初始化'处理所有这些角落案例,并避免微妙和困难的错误。在实例方法中进行类初始化并不好。如果你在类方法中使用它,为什么不在正确的时间自动调用'+ initialize'? – 2012-03-29 17:49:40

+0

重新阅读我的评论,现在对我来说似乎还不太清楚。对不起,我的意思是用'dispatch_once()'代替'if(self == [MYClass class])',在'+ initialize'内部,_not_在别处移动字典创建。然后,第一条消息继承树中的任何一个类都将创建该字典,并且不会有人重新创建它。是对的吗? – 2012-03-29 18:04:13

3

如果这不是太麻烦(即它不是很大),你可以硬编码你的NSDictionary,或者你可以创建一个plist并将其包含在您的应用程序包中。然后在应用程序启动时,阅读plist的字典(几行代码)。这些方法中的每一种都是大致相同的努力。使用plist的好处是,如果你必须改变它,你正在编辑plist,而不是代码。

+0

这是我过去经常使用它的方式。但是,它仍然让我觉得很肮脏,因为你正在为编译时已知的某些东西进行运行时计算! – elsurudo 2012-03-30 16:00:57

+0

如果plist很大,运行时间可能会很大。但是有办法将这个过程推到背景并减轻任何可感知的滞后。另一方面,你想维护什么:代码或plist?这里的答案在一定程度上取决于数据的性质和大小。 – 2012-03-30 16:37:36

+1

好点,马克。我同意维护一个PLIST是可取的,但这种情况下的数据量很小。但是,为了简单和可读性,我可能会最终选择PLISt路线。 – elsurudo 2012-03-30 16:57:16

相关问题