Как очистить словарь?

в настоящее время я делаю следующее, Чтобы очистить NSMutableDictionary

[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

строка выпуска фактически не освобождает никакие объекты в словаре. Я все еще вижу их на следующей линии. Только после выполнения строки alloc словарь обнуляется. Есть ли лучший способ сделать это?

4 ответов


Я не могу проверить это на данный момент, но вы пробовали removeAllObjects метод NSMutableDictionary?

http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSMutableDictionary_Class/Reference/Reference.html#//apple_ref/occ/instm/NSMutableDictionary/removeAllObjects


вы говорите:

линия выпуска на самом деле не освободите все объекты в словаре. Я все еще вижу их всех на экране. следующая линия. Это не так, пока alloc строка выполняется, что словарь обнуляется. Есть ли лучший способ сделать это?

если -release изменяемого словаря приводит к освобождению словаря - сбрасывает счетчик сохранения до нуля - тогда изменяемый словарь освободит все содержащиеся объекты. Всегда.

таким образом, если объекты не освобождаются, то это предложенное "исправление"...

[myDictionary removeAllObjects];
[myDictionary release];
myDictionary = [[NSMutableDictionary alloc] init];

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

в результате, назвав -removeAllObjects будет очистить словарь и освободить все содержащиеся объекты,но у вас все еще есть утечка памяти, что вы должны выяснить и исправить.


будет Блант:

если объекты в вашем словаре не освобождаются, когда словарь получает вышеуказанное -release (без вызова -removeAllObjects), то есть утечка памяти. Это либо:

  1. объекты в словарь было сохранено дополнительное время.

  2. там все еще выдающийся -retain на словарь.

поскольку вы говорите, что объекты правильно (как и ожидалось) освобождается, когда вы звоните -removeAllObjects, тогда это должно быть (2). Просмотрите свой код и выясните, где есть дополнительный -retain словаря. Вы можете использовать Объект Alloc инструмент, чтобы выяснить, где именно все сохраняет приходят из.


-removeAllObjects будет работать, как Энди упомянул. Однако, если какой-либо из объектов вашего словаря автоматически выпущен, или если сам словарь был autoreleased где-то вдоль линии, тогда они не будут dealloc бы до того времени, когда runloop заканчивается (когда autorelease пул сливают).


[aMutableDictionary removeAllObjects];

С документация Apple:

(void)removeAllObjects

Description-опустошает словарь его записей. Каждый ключ и соответствующему объекту value отправляется сообщение release.

доступность-iOS (2.0 и более поздние версии)