Да.
Объекты коллекции сохраняют вещи, которые они собирают, поэтому, когда коллекция освобождается, она уравновешивает хранение с выпуском.
Затем, если один из словарей, на которых он держался, освобождается, он также освобождает свои пары ключ / значение, поскольку словарь является коллекцией, а объекты коллекции сохраняют то, что собирают.
То же самое относится и к массивам и наборам.
Однако в вашем коде есть ошибка. У вас есть:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict release];
[newDict retain];
aDict = newDict;
}
Рассмотрим случай, когда newDict
- это тот же объект, что и aDict
. Затем вы освобождаете словарь, он освобождается, и затем вы пытаетесь сохранить его, но упс! Его больше нет.
Есть три варианта исправления. Вот они:
- (void) setADict: (NSMutableDictionary *) newDict
{
[aDict autorelease];
[newDict retain];
aDict = newDict;
}
- (void) setADict: (NSMutableDictionary *) newDict
{
if (aDict != newDict) {
[aDict release];
[newDict retain];
aDict = newDict;
}
}
- (void) setADict: (NSMutableDictionary *) newDict
{
[newDict retain];
[aDict release];
aDict = newDict;
}
Я бы сказал, что третий самый простой, второй самый быстрый со временем, а первый - meh . Первый будет загромождать ваши пулы авто-релиза (что может или не может привести к переполнению памяти). Второе и третье эквивалентны с точки зрения безопасности и управления памятью свойств. Тем не менее, второй сэкономит вам ненужные вызовы методов, если вы устанавливаете тот же словарь на себя.