"Release> nil> init" Приемлемый способ обновить NSMutableDictionary? - PullRequest
0 голосов
/ 27 июля 2011

Является ли метод, описанный ниже, приемлемым (т.е. передовым, не хакерским) способом обновления NSMutableDictionary?

По сути, я хочу, чтобы метод проверял, был ли словарь инициализирован / заполнен еще.Если это НЕ, тогда я хочу, чтобы он продолжал и заполнил его определенным набором iVars, который у меня есть, с соответствующим набором ключей.

Если он уже был инициализирован / заполнен, я хочу обновитьи я хотел избежать необходимости выписывать setObject:forKey: для каждого элемента в dict.

Итак ...

  1. Is "Release"> "Set nil">«Повторно инициировать» приемлемый подход к обновлению этого словаря?
  2. Если это так, является ли способ only сделать это для словаря больших значений, если я не хочу повторять строку за строкойиз setObject:forKey:

Спасибо!Код следующий:

- (void) populateFetchDataDict {

    if (!self.fetchDataDict) {
        self.fetchDataDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
    } else {
        [fetchDataDict release];
        fetchDataDict = nil;
        self.fetchDataDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
    }

}

Незначительные примечания:

  • fetchDataDict - это iVar, как и все объекты, поэтому предположим, что object1, object2 и т. Д.на самом деле было бы self.object1, self.object2 ...
  • Кроме того, я получил прямой доступ к fetchDataDict iVar для release и nil, поскольку я думал, что это то, что мы должны делать, но, пожалуйста, поправьте меня, если я ошибаюсь.

Этот вопрос сфокусирован на обучении, поэтому длинные объяснения приветствуются!

1 Ответ

1 голос
/ 27 июля 2011

Поскольку вы используете средства доступа к свойствам, и я предполагаю, что у вас есть свойства, помеченные как retain, вы можете просто установить новое значение - старое будет выпущено автоматически.Фактически, единственная причина, по которой ваш код сейчас не падает, состоит в том, что вы чрезмерно сохраняете новые словари, не выпуская их автоматически, что вы должны сделать.*

- (void) populateFetchDataDict {
        self.fetchDataDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
}

Если вы хотите установить эти конкретные значения только в существующем словаре, вы можете добавить обратно в оператор if и объединить эти значения по умолчанию с существующим словарем:

- (void) populateFetchDataDict {

        NSDictionary *defaultDict = [NSMutableDictionary dictonaryWithObjectsAndKeys:object1, @"key1", object2, @"key2", object3, @"key3", object4, @"key4", nil];
    if (!self.fetchDataDict) {
        self.fetchDataDict = defaultDict;
    } else {
        [self.fetchDataDict addEntriesFromDictionary:defaultDict];
    }

}
...