【问题标题】:How to design a static class?如何设计一个静态类?
【发布时间】:2009-03-11 03:58:20
【问题描述】:

我想创建一个特殊的类来保存很多值,比如 strName、strNo、intPassword...以便其他几个类可以修改这个类中的相同值。 我想使用点语法来调用它的属性,比如

Values.strName = ...; 
我不想在每次读/写它的值之前初始化类,因为它的一些值仍在使用中。

我将类称为“值”并使用以下代码对其进行设计:

@interface Values : NSObject {
    IBOutlet NSString *strName;
}
@property (nonatomic, copy) NSString *strName;
@end

我将“Values.h”导入另一个类并使用

调用该属性

Values.strName = @"Name";

我不创建“值”对象以避免数据被覆盖。弹出一个错误,说“之前的语法错误”。令牌'。还有其他方法可以创建一个存储全局变量但在使用这些数据时不需要初始化的类吗?

【问题讨论】:

    标签: objective-c cocoa properties class-design


    【解决方案1】:

    解决这个问题的另一个方法是将变量(或类)添加到 AppDelegate 对象。 AppDelegate 很容易变成一团乱麻,但如果这些变量确实是您的应用程序的属性,那么它就是适合它们的地方。

    您始终可以使用 [UIApplication sharedApplication].delegate 获取对您的 AppDelegate 的引用(您可能需要强制转换)

    【讨论】:

    • 好主意!这可能是存储全局变量的最简单方法。谢谢。
    • 另一种方式,至少在 Mac 上,是继承 NSApplication 并将属性放在那里。我不知道你是否可以用 UIApplication 做到这一点。
    • 好建议。经过一番尝试,我发现我可以像委托类一样声明一个新类来存储全局数据。谢谢。
    【解决方案2】:

    我想创建一个特殊的类来保存很多值,例如 strName、strNo、intPassword...

    为什么?将不可变和原始对象放在只读全局变量中没有任何问题:

    NSString *const strName = @"Name";
    const NSInteger intPassword = 0xDEADBEEF;
    

    如果您想将它们作为全局变量添加前缀,“g”(如 gStrName 等)很常见并且可以正常工作。

    您可能会说“但全局变量是邪恶的!”,但想想您在说什么:为什么全局变量是邪恶的?

    • 因为其他代码可以改变对象。 (不可变对象则不然。)
    • 因为其他代码可以替换对象。 (对于只读 (const) 变量则不然。)
    • 因为两段代码可以使用同一个对象。 (如果对象是基本对象,例如字符串或整数,则没有问题。)

    只要这些抱怨都不适用,全局变量就没有问题。它们在 Cocoa 中很常见(例如,它的大多数字符串常量实际上是全局变量)。

    【讨论】:

    • 之所以要创建这个类,是因为这个类是用来让其他类读写它的值(几个类可以修改同一个值)。我忘了提:这些值不是 const。
    【解决方案3】:

    如果您使用单例模式,那么您可以实现接近此的效果。使用 Matt Gallagher 的“SynthesizeSingleton.h”助手:

    // Values.h
    #import "SynthesizeSingleton.h"
    
    @interface Values : NSObject {
      ...
    }
    
    // props
    
    + (Values *)sharedValues;
    @end
    
    // Values.m
    @implementation Values
    
    SYNTHESIZE_SINGLETON(Values);
    
    @synthesize props;
    
    @end
    

    然后使用你的单例:

    NSString *myVal = [[Values sharedValues] someValue];

    或:

    Values *v = [Values sharedValues];

    NSString *myVal = v.someValue;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多