iPhone - напишите класс, который может быть создан несколько раз, при этом каждый экземпляр может получить доступ к общему свойству - PullRequest
0 голосов
/ 04 марта 2012

Я знаю, что это можно сделать на многих языках, но я не понимаю, как это сделать с помощью Objective-C.Я читал о синглетах, но поскольку они предназначены для создания экземпляра только один раз, они не удовлетворяют эту потребность.

Таким образом, этот класс можно назвать так:

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

или

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

Я пробовал этот код, но я уверен, что он действительно плохой, но я не вижу, как этого добиться:

.h file

@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

1 Ответ

0 голосов
/ 04 марта 2012

взгляните на концепцию класса Singleton есть много ответов для синглетонов, просто поиск

вот один:

Это действительно синглтон?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...