iPhone编写了一个可以多次实例化的类,每个实例都可以访问一个共享属性



我知道这可以用很多语言来实现,但我不知道如何使用Objective-C来实现。我读过关于单身人士的文章,但由于他们的设计只能安装一次,所以他们无法满足这种需求。

所以这个类可以这样称:

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

了解singleton类的概念单身人士有很多答案,只需搜索

这里有一个:

这真的是单身吗?

相关内容

最新更新