Доступ к NSDictionary в классе Singleton без создания копий - PullRequest
0 голосов
/ 29 марта 2012

У меня есть синглтон, как показано ниже, который создает экземпляр NSDictionary для хранения моих данных. Вот .h:

@interface FirstLast : NSObject

@property (strong, nonatomic, readonly) NSArray *firstArray;
@property (strong, nonatomic, readonly) NSArray *lastArray;
@property (strong, nonatomic, readonly) NSDictionary *fl;

+ (FirstLast *) firstLast;
- (NSDictionary *) tempDic;

@end

Вот это .m

@implementation FirstLast

@synthesize firstArray = _firstArray;
@synthesize lastArray = _lastArray;
@synthesize fl = _fl;

+ (FirstLast *)firstLast {
    static FirstLast *singleton;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        singleton = [[FirstLast alloc] init];
        NSLog(@"FirstLast instantiated");
    });
    return singleton;
}

- (NSDictionary *) tempDic{

    _firstArray = [[NSArray alloc] initWithObjects:@"Bob", @"Joe", @"Sally", @"Sue", nil];
    _lastArray = [[NSArray alloc] initWithObjects:@"Jones", @"Johnson", @"Thompson", @"Miller", nil];
    _fl = [NSDictionary dictionaryWithObjects:_firstArray
                                    forKeys:_lastArray];
    NSLog(@"tempDic just made _fl at this address");
    NSLog(@"%p", _fl);
    return _fl;
}

@end

Все это прекрасно работает. В контроллере вида я создаю все это впервые (тоже работает нормально):

 NSLog(@"VC is setting up tempDic");

 [[WordsClues wordsClues] tempDic];

Когда я пытаюсь получить доступ к tempDic в другом месте, например:

NSInteger rIndex = arc4random_uniform(4) + 1;
NSString *fname = [[[FirstLast firstLast].tempDic allValues] objectAtIndex:rIndex];

работает нормально, но, когда я повторяю этот процесс, каждый раз я создаю новый tempDic. Я знаю это, потому что NSLog, давая адрес, каждый раз дает другой ответ. Я действительно хочу получить доступ к существующему словарю, что, как я думал, должен был выполнить мой синглтон. Очевидно, я либо неправильно обращаюсь к tempDic, либо неправильно понимаю, что синглтон может сделать для меня, либо у меня неправильно настроен tempDic. Цель состоит в том, чтобы получить случайное значение из одной копии tempDic, а не записывать локальные копии tempDic повсюду. Спасибо.

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

Почему вы вообще воссоздаете словарь в -tempDic?

Т.е. переместите код создания словаря в init, а затем просто return _fl; в tempDic.

Нетволнует - мы все были там [новые].

В вашем классе FirstLast реализуйте метод init как-то так:

- init
{
     self = [super init];
     if ( self ) {
          _fl = ... create your dictionary here ...;
     }
     return self;
}

Затем измените -tempDic на:

- (NSDictionary*)tempDic {
     return _fl;
}

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

Вопросы, которые вы задаете, более соответствуют "Что такое объектно-ориентированное программирование и как работает Objective-C?

ответить на ваш вопрос;FirstLast - это класс, и шаблон синглтона гарантирует, что существует только один экземпляр этого класса.Перемещая создание словаря в метод init - который вызывается только один раз и который сохраняет ссылку на созданный словарь в переменной экземпляра - вы избегаете создания нескольких экземпляров словаря.

1 голос
/ 29 марта 2012

Альтернативно вы можете сделать это

- (NSDictionary *) tempDic{
    if( _fl == nil )
    {
        _firstArray = [[NSArray alloc] initWithObjects:@"Bob", @"Joe", @"Sally", @"Sue", nil];
        _lastArray = [[NSArray alloc] initWithObjects:@"Jones", @"Johnson", @"Thompson", @"Miller", nil];
        _fl = [NSDictionary dictionaryWithObjects:_firstArray
                                    forKeys:_lastArray];
        NSLog(@"tempDic just made _fl at this address");
        NSLog(@"%p", _fl);
    }
    return _fl;
}
1 голос
/ 29 марта 2012

Каждый раз, когда вы вызываете tempDic, вы создаете новую его копию. Что вам нужно сделать, это добавить свой код для создания словаря в ваш экземпляр alloc, а затем просто получить его в своем получателе.

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