2012-03-04 46 views
0

我知道这可以用很多语言来完成的,但我不明白如何使用Objective-C这样做。我已经读过关于单身人士的消息,但是因为他们被设计成只能实现一次,所以他们不会满足这种需求。iPhone - writign可以被实例化多次类,每个实例都能够访问共享属性

所以这个类可以被称为是这样的:

MyClass* obj1 = [[MyClass alloc] initWithKey:@"oneKey"]; 
NSString* lib = obj1.lib; 

int id = [MyClass idForKey:@"anotherKey"]; 

我试过这个代码,但我敢肯定它是非常糟糕的,但我没有看到如何实现这一点:

.h文件中

@interface MyClass : NSObject { 
    NSString* key; 
} 

@property(nonatomic, retain) NSString* key; 
@property(nonatomic, readonly) int id; 
@property(nonatomic, readonly) NSString* lib; 
@property(nonatomic, readonly) int value; 

+ (id) classWithKey:(NSString*)theKey; 

@end 

.m文件

#import "MyClass.h" 

@interface MyClass.h (Private) 
-(id)initWithKey:(NSString*)theKey; 
@end 

@implementation MyClass 

@synthesize key; 

static NSMutableDictionary* vars = nil; 


-(id)init 
{ 
    if (!(self = [super init])) return nil; 
    self.key = nil; 
    [MyClass initVars]; 
    return self; 
} 


-(id)initWithKey:(NSString*)theKey 
{ 
    if (!(self = [super init])) return nil; 
    self.key = theKey; 
    [MyClass initVars]; 
    return self; 
} 


+ (id) classWithKey:(NSString*) theKey 
{ 
    return [[[MyClass alloc] initWithKey:theKey] autorelease]; 
} 


+(void)initVars 
{ 
    if (vars != nil) return; 

#define mNum(x) [NSNumber numberWithInt:x] 
#define k0 @"id" 
#define k1 @"lib" 
#define k2 @"val" 

    vars = [NSMutableDictionary dictionary]; 
    [vars setObject:[NSDictionary dictionaryWithObjectsAndKeys:mNum(5), k0, @"One value", k1,  mNum(0), k2, nil] forKey:@"oneKey"]; 
    [vars setObject:[NSDictionary dictionaryWithObjectsAndKeys:mNum(8), k0, @"Another value", k1, mNum(1), k2, nil] forKey:@"anotherKey"]; 
    ... 

    [vars retain]; 
} 


- (int)id   { return [[[vars objectForKey:self.key] objectForKey:k0] intValue]; } 
- (NSString*)lib { return [[vars objectForKey:self.key] objectForKey:k1]; } 
- (int)value  { return [[[vars objectForKey:self.key] objectForKey:k2] intValue]; } 


-(void)dealloc 
{ 
    self.key = nil; 
    [vars release]; 
    [super dealloc]; 
} 

+(int) idForKey:(NSString*)theKey 
{ 
    if (vars == nil) [self initVars]; 
    return [[[vars objectForKey: theKey] objectForKey:k0] intValue]; 
} 

@end 
+0

singleton被设计为被实例化JUST ONCE,然后所有其他调用来实例化该类只是不在对一个新的实例进行实例化,但只是取回它的第一个实例 – meronix 2012-03-04 17:42:05

+0

@meronix:这就是为什么我认为singleton不会帮助。我需要一个可以实例化的类,并且它有一个共享变量,也可以通过类方法访问。 – Oliver 2012-03-04 20:46:10

+0

ok,但是为​​什么不移动JUST这个共享var,在你的类的所有实例中使用,在一个新的单例类中? – meronix 2012-03-04 21:01:51

回答