【问题标题】:Better alternative for "data-only" Objective-C objects?“仅数据”Objective-C 对象的更好选择?
【发布时间】:2011-01-17 04:25:53
【问题描述】:

我经常遇到这样的设计选择并且有点挣扎;我正在寻找其他一些观点。

我经常想要保留或传递基本上只是一组值的状态块的列表。这些值往往是原始类型:浮点数、NSTimeIntervals、CGPoints 等。

我的第一个倾向通常是为这些属性集创建 C 结构,例如

typedef struct _STATE {
    float foo;
    NSTimeInterval elapsed;
    CGPoint point;
} STATE;

等等

但是 C 结构不能很好地与原生 Cocoa 集合类(NSArray、NSSet、NSDictionary)配合使用,并且使用过多的它们来跟踪大量状态感觉就像它违背了休息的规律我的 Cocoa 友好代码——我最终拥有并直接管理结构数组,并在消息中传递结构指针等。

另一方面,由于原始性能不一定很关键,我可以将这些值编码到一个 NSDictionary 中,将它们全部包装在 NSValue 或 NSNumber 中,但生成的语法并不简洁,而且有点脆弱,在运行时要求插入和查找的类型和名称正确:

[stateDict setObject:[NSNumber numberWithFloat:foo] forKey:@"bar"];
... 
float something = [[stateDict objectForKey:@"bar"] floatValue];

而某些类型,例如 NSTimeInterval,只能与一些(有争议的)hackery 一起使用(在这种情况下类型转换为加倍)。

最后,我可以使用私有成员数据和只有 getter/setter 来创建纯数据容器对象。 (这些在 Java 中被称为“bean”。)它们比字典更简洁,Cocoa 比结构更多,但对我来说感觉有点矫枉过正,尤其是当我只需要它们作为用于状态管理的“内部类”时单个对象类型的内部。

伟大的 Cocoa 编程公众,你是怎么做到的?

【问题讨论】:

    标签: objective-c cocoa design-patterns nsdictionary cocoa-design-patterns


    【解决方案1】:

    根据具体情况,我要么使用 NSDictionary 类来运行任意数据,要么创建容器类(Objective C 中的@property/synthesize 标签使这变得非常容易)。通过使用 ObjC 作为头文件:

    @interface StateObject : NSObject {
        NSNumber *foo;
        NSTimeInterval *elapsed;
        CGPoint point;
    }
    
    @property (retain) NSNumber *foo;
    @property (retain) NSTimeInterval *elapsed;
    @property (copy)   CGPoint point;
    
    @end
    

    然后可以在.m 文件中使用@synthesize <variable> 来自动创建setter/getter。然后,虽然匿名 NSNumber 仍然很烦人,但您可以这样做:

    myStateObject.foo = [NSNumber numberWithFloat:7.0];
    

    这应该可以消除大部分痛苦,并让您使用 Cocoa 集合类来更好地打乱数据。

    【讨论】:

    • +1。创建模型类几乎总是可行的方法,除非您有一些性能非常关键的代码,其中使用对象的开销会导致问题。
    • 感谢这个马特。在这种情况下,您甚至不需要用 NSNumber 包装浮点数——可以使用 @property 语法来访问原始类型。 (当然 NSTimeInterval 也是如此,它恰好是一个 typedef 的原始浮点数。)
    【解决方案2】:

    不一定认为这种方法是“最好的”,但在您的建议之间有一个中间立场:创建 C 结构来保存信息,然后在需要将它们放入 Cocoa 数据时将结构包装在 NSValue 对象中结构。在某些情况下,您可以看到 UIKit 在通知中使用 CGPoint 之类的结构来执行此操作(我相信 AppKit 也会这样做)。

    有关详细信息,请参阅 Number and Value Programming Topics for Cocoa 中的“使用值”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多