2012-03-04 47 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

回答