Цель C, счетчик ссылок NSMutableDictionary - PullRequest
2 голосов
/ 14 марта 2011
    NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary
    if (attrs == nil) {
         attrs = [[NSMutableDictionary alloc] init];
         [nodeAttributes setObject:attrs forKey:UUID];
         [attrs release];
    }

Я не уверен, что этот код будет работать ... Должен ли я иметь что-то подобное вместо этого

    NSMutableDictionary *attrs = [nodeAttributes objectForKey:UUID];//nodeAttributes is NSMutalbleDictionary
    if (attrs == nil) {
         attrs = [[NSMutableDictionary alloc] init];
         [nodeAttributes setObject:[attrs retain] forKey:UUID];
         [attrs release];
    }

Я не уверен, что метод setObject увеличит счетчик ссылок ...

Ответы [ 4 ]

4 голосов
/ 14 марта 2011

NSMutableDictionary's setObject сохранит объект (это задокументировано ), поэтому первый бит кода правильный, а второй утечка.В отношении стиля читателю может быть более понятно выполнить следующее:

if (attrs == nil) {
     attrs = [NSMutableDictionary dictionary];
     [nodeAttributes setObject:attrs forKey:UUID];
}

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

2 голосов
/ 14 марта 2011

Объекты несут ответственность за право собственности на вещи, которыми они владеют.Так что да, setObject:forKey: сохранит.Это подробно объясняется (но все же очень кратко) в руководстве по управлению памятью Apple .

2 голосов
/ 14 марта 2011

Счет сохранения будет увеличен в первом случае. Это правильный подход.

0 голосов
/ 14 марта 2011

setObject отправит сообщение сохранения, поэтому вам не нужно этого делать.

...