Сохраняет ли [NSMutableDictionary setValue: value forKey: key] ключ NSString? - PullRequest
6 голосов
/ 22 марта 2009

При добавлении элементов к NSMutableDictionary с использованием метода setValue:forKey: (я полагаю, это обобщается на любой NSObject), словарь сохраняет второй параметр, NSString?

Например:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *theString = @"hello";
int i;
for (i=0; i<[theString length]; i++){
    NSNumber *myInt = [NSNumber numberWithInt:i];
    NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]];
    [dict setValue: myInt forKey:character];
}
[dict release];
[pool release];

Очевидно, что нет смысла освобождать myInt в цикле, оно сохраняется dict, поэтому его нельзя освободить до конца кода. Но верно ли то же самое для character? Я думаю, что если NSMutableDictionary хранит строку каким-либо другим способом, то можно создать временный пул вокруг цикла и освободить эти строки вместо ожидания выхода из словаря.

Мне также любопытно, почему retainCount из character равно 7fffffff, как будто это NSConstantString, я бы ожидал, что stringWithFormat вернет объект NSString, который должен быть сохранен, но это не так Кажется, это так.

Ответы [ 2 ]

8 голосов
/ 23 марта 2009

В Какао очень распространено копирование NSString параметров вместо сохранения. Это потому, что вы могли бы так же легко дать словарю экземпляр NSMutableString. Поскольку значение строки может измениться, NSDictionary делает копию.

Но, независимо от того, как на самом деле работает * 1006, вам не нужно беспокоиться о том, нужно ли сохранять character. После того, как вы передали его в NSMutableDictionary в качестве параметра, на самом деле задача этого класса - решить, как хранить данные, если только в документации не указано, что сохранение объектов - ваша ответственность.

Я бы тоже не слишком беспокоился о retainCount любого объекта. Следование количеству объектов, находящихся слишком близко, может привести вас к кроличьим отверстиям, которые заставляют вас вращать колеса.

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

4 голосов
/ 22 марта 2009

Вам не нужно сохранять character там, словарь сохраняет его, когда вы задаете его как ключ, и ваш собственный код не нуждается в его сохранении.

Вам также не нужно беспокоиться о том, почему счет удержания не соответствует ожидаемому. Может быть, в базовом фреймворке есть экземпляры типа Flyweight с загрузкой односимвольных NSString экземпляров. В любом случае, если у вас есть правильное управление памятью, следуя инструкциям, вы будете в порядке, независимо от того, что платформа делает за кулисами. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

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