【问题标题】:Alternative to NSDictionary with single object/key使用单个对象/键替代 NSDictionary
【发布时间】:2012-07-29 08:45:45
【问题描述】:

假设我想要一个项目,使用我要编写的字典来保存一个字符串作为键的值:

[NSDictionary dictionaryWithObject:@"someString" forKey:@"stringKey"];

我在问如何在没有字典(模棱两可,程序员需要知道键)或对象(这个瘦对象的过度杀伤,不需要方法)的情况下做到这一点,在结构行中,我之前尝试过结构,但我在 iOS 中没有看到任何使用chars 作为结构项的结构,所以我不确定这是要走的路。结果应该是这样的:

replacement.key = value;

有什么想法吗?

【问题讨论】:

  • 为什么不能使用NSDictionary
  • 你想达到什么目的?你能举个例子或一些背景吗?

标签: objective-c c syntax struct nsdictionary


【解决方案1】:

我不确定,如果它是你想要的,但你可以使用struct

 typedef struct {
    __unsafe_unretained NSString* key;
   ...
 } foo;

 foo bar;
 NSString* foobar = @"Hello";
 bar.key = foobar;

注意,ARC 没有理由不处理此值。但是,如果您对该值有强引用,则可以使用它。

【讨论】:

  • 如何使用它从该键中获取值?
  • 我的理解是,OP 希望通过名称访问组件,即,就像在“普通”C struct 中一样。 key 在这里只是 symbol 来处理结构的组件,而不是 KVC 中的键。
  • 以上内容极其危险。该字符串可以随时丢弃,您的key 将成为一个悬空指针。虽然可能,但除非没有其他解决方案,否则应强烈避免。文本中出现“不安全”一词是有原因的。
  • 使用 chars 代替 NSString 会有所作为吗?
  • 如果你使用 char* 而不是 NSString,那么是的,这只是 C,所以它会起作用。但是您必须对 char* 进行内存管理(或使用固定长度的字符串)。这是一个很大的开销,以避免一点开销。
【解决方案2】:

除非您遇到非常专业的问题,否则很少会使用小数据对象。例如,如果您有数千个这样的对象,特别是如果您需要快速创建和销毁它们,并且您已经分析了您的应用程序并发现对象本身是一个真正的问题,那么您应该考虑不使用简单的数据对象.但在一般情况下,您应该使用简单的数据对象。

【讨论】:

    【解决方案3】:

    带有@property@synthesize 的瘦对象将免除您创建方法的任何痛苦。所有实例变量都将在没有您的任何代码的情况下创建和修改。

    这样的对象定义几乎不会比结构大,并且作为NSObject 的子类,它可以放在任何数组或其他只接受NSObject 子类的框架容器中。你将无法使用结构来做到这一点。

    如果您使用 XCode 4.4(用于 Mac 开发)或 4.5(用于 iOS),您甚至可以删除 @synthesize 并且只有 @property

    只有当您非常注重性能并且需要摆脱 NSObject 层次结构时,您才应该考虑放弃它并使用 C 结构。

    【讨论】:

      【解决方案4】:

      为什么不直接使用字典,而是创建一组 NSString 常量作为键?那么歧义就会减少。

      例如,考虑 Apple 用于从 NSError 的 userInfo 字典 NSLocalizedDescriptionKey 检索本地化字符串的键常量。 Many other keys are used as well to retrieve specific parts of information 并且因为这些键是常量,所以它们很容易在 Xcode 中使用(自动完成)。另一个使用字符串常量从 NSDictionary 中检索值的示例是 NSFileManager

      此外,仅使用对象也应该没问题,在大多数情况下,“开销”应该可以忽略不计——当然用户不会注意到任何事情。至少,please don't try to prematurely optimize your code 对于在很远的将来可能会发生的情况......

      【讨论】:

      • 我通常使用#define 作为密钥,但这也可以,您仍然需要让程序员知道这些是正确的密钥。可以避免这么多 Stack Overlfow 问题
      猜你喜欢
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2011-12-25
      相关资源
      最近更新 更多