Как очистить словарь?
в настоящее время я делаю следующее, Чтобы очистить NSMutableDictionary
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
строка выпуска фактически не освобождает никакие объекты в словаре. Я все еще вижу их на следующей линии. Только после выполнения строки alloc словарь обнуляется. Есть ли лучший способ сделать это?
4 ответов
Я не могу проверить это на данный момент, но вы пробовали removeAllObjects
метод NSMutableDictionary
?
вы говорите:
линия выпуска на самом деле не освободите все объекты в словаре. Я все еще вижу их всех на экране. следующая линия. Это не так, пока alloc строка выполняется, что словарь обнуляется. Есть ли лучший способ сделать это?
если -release
изменяемого словаря приводит к освобождению словаря - сбрасывает счетчик сохранения до нуля - тогда изменяемый словарь освободит все содержащиеся объекты. Всегда.
таким образом, если объекты не освобождаются, то это предложенное "исправление"...
[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];
... является утечкой памяти в том, что исходный экземпляр NSMutableDictionary будет утечка.
в результате, назвав -removeAllObjects
будет очистить словарь и освободить все содержащиеся объекты,но у вас все еще есть утечка памяти, что вы должны выяснить и исправить.
будет Блант:
если объекты в вашем словаре не освобождаются, когда словарь получает вышеуказанное -release
(без вызова -removeAllObjects
), то есть утечка памяти. Это либо:
объекты в словарь было сохранено дополнительное время.
там все еще выдающийся
-retain
на словарь.
поскольку вы говорите, что объекты правильно (как и ожидалось) освобождается, когда вы звоните -removeAllObjects
, тогда это должно быть (2). Просмотрите свой код и выясните, где есть дополнительный -retain
словаря. Вы можете использовать Объект Alloc инструмент, чтобы выяснить, где именно все сохраняет приходят из.
-removeAllObjects будет работать, как Энди упомянул. Однако, если какой-либо из объектов вашего словаря автоматически выпущен, или если сам словарь был autoreleased где-то вдоль линии, тогда они не будут dealloc бы до того времени, когда runloop заканчивается (когда autorelease пул сливают).
[aMutableDictionary removeAllObjects];
(void)removeAllObjects
Description-опустошает словарь его записей. Каждый ключ и соответствующему объекту value отправляется сообщение release.
доступность-iOS (2.0 и более поздние версии)