什么是更好的:全球字符串或单身?

时间:2009-01-12 21:43:06

标签: objective-c iphone

对于我的全新ORM(chibi-ORM),我面临一项设计决定。

我正在为关系构建API,例如:

@interface SamplePerson : DbObject {
    NSString *name;
        DbObjectRelation *cities;
}

现在,对于DbObjectRelation我有这个模型:

@interface DbObjectRelation : NSObject {
    NSMutableArray *childRows;
    DbObject *parent;
    BOOL isLoaded;
}

-(void) load;

-(void) addObject:(DbObject *) childRow;
-(void) removeObject:(DbObject *) childRow;

- (id)initWitParent:(DbObject *)parentObject;

所以,我需要一种知道哪种数据库用于加载记录的内部加载方式。

我认为在我的数据库连接中有类似的东西:

static NSString *currentDbNameSingleton = nil;

+(NSString *)currentDbName {
    @synchronize( self ) {
        if ( currentDbNameSingleton == nil ) {
            currentDbNameSingleton = [[NSString alloc]
        }
    }
    return sharedInst;  
}

+(void) setCurrentDbName(NSString *)name {
    @synchronize( self ) {
      currentDbNameSingleton = [name copy];
    }
}

但是想知道是否更好地将DB类构建为单例。这适用于iPhone项目...

2 个答案:

答案 0 :(得分:2)

在你正在做的静态变量周围使用一组类访问器/ mutator是非常合理的。如果你不打算更改数据库名称,另一个非常常见的解决方案是将它放在一个单独的文件中,比如Constants.h,以及其他常量字符串,如字典和用户默认密钥。

如果您有与数据库相关的其他代码可以重构到一个地方,那么为数据库内容构建单例类是非常好的一点。我不会创建一个只是为了保持字符串的类。

答案 1 :(得分:1)

对于不变的字符串,您应该将它们创建为常量。

即。在数据库连接文件中:

const NSString *CurrentDbName = @"name of database";

请注意capitlization以传达编译时生成和常量。

它比字符串的单例更有效。当然,您无法使用其他类型的Objective-C对象执行此操作,因为它们无法由编译器创建。对于这些,请使用单身。

如果程序的其他部分需要访问字符串,则应在数据库的头文件中使用extern引用:

extern const NSString *CurrentDbName;