Изменение класса NSDictionary, если он содержится во внешнем синглтоне? - PullRequest
0 голосов
/ 08 декабря 2011

В данный момент я наблюдаю несколько жестокое поведение: у меня есть ViewController для программного создания View.Для этого я сохранил имена UILabels, которые будут отображаться в NSDictionary, который содержится во внешнем классе, который является одиночным.К сожалению, NSDictionary недоступен, если я хочу использовать значения в loadView.Итак, я сделал несколько тестов: NSDictionary и его содержимое доступны в init, и класс, конечно же, NSCFDictionary.Если я смотрю на это в loadView, то класс иногда является NSCFDictionary, а иногда также CALayer или NSString ?!Я абсолютно не знаю, что происходит ???Это код, который я использую:

- (id) init
{
    self = [super initWithNibName:nil bundle:nil];    
    if (self)
    {
        UITabBarItem *tbi = [self tabBarItem];
        [tbi setTitle:@"xxx"];
    }

    NSEnumerator *num = [[[ValueDispatcher dispatcher] labelDic] keyEnumerator];
    NSLog(@"Class(init): %@", [[[ValueDispatcher dispatcher] labelDic] class]);
    NSLog(@"No: %i", [[[ValueDispatcher dispatcher] labelDic] count]);
    for (id key in num)
    {
        NSLog(@"Key %@  Value  %@", key, [[[ValueDispatcher dispatcher] labelDic] valueForKey:key]);
    }

       return self;
    }  

- (void)loadView 
{
    NSLog(@"Class(loadview)1: %@", [[[ValueDispatcher dispatcher] labelDic] class]);
    NSLog(@"No: %i", [[[ValueDispatcher dispatcher] labelDic] count]);
    NSEnumerator *num = [[[ValueDispatcher dispatcher] labelDic] keyEnumerator];
    for (id key in num)
    {
        NSLog(@"Key34 %@  Value  %@", key, [[[ValueDispatcher dispatcher] labelDic] valueForKey:key]);
    }
...

В какой момент между init и loadView можно или нужно изменить NSDictionary?Кстати, еще одна информация, которая может быть важна: если я использую приведенный выше код и NSDictionary заполнен внешней службой, все работает нормально.Но если я заполняю NSDictionary из сохраненного plist во время запуска, он не работает, и я наблюдаю описанное поведение ...

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Вам нужно будет сохранить этот словарь так долго, как это нужно вашему синглтону.

Если вы используете ARC, просто убедитесь, что ivar и / или свойство являются сильными.

Если вы не используете ARC, и у вас есть установщик свойств, чтобы управлять этим для вас, убедитесь, что вы действительно используете этот установщик.

А если нет ARC, и вы устанавливаете свой ivar напрямую, просто сохраните словарь (и выпустите старый, если таковой имеется)

0 голосов
/ 08 декабря 2011

Если я взгляну на него в loadView, то классом иногда является NSCFDictionary, а иногда также CALayer или NSString?

это (как правило) означает, что у вас есть проблема с количеством ссылок или вы не зарегистрировали своих наблюдателей правильно - при условии, что вы никогда не устанавливали словарь. запускать инструменты с включенными зомби.

В какой момент между init и loadView можно или нужно изменить NSDictionary?

в это время может произойти многое, помимо кода, который вы разместили.

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