Я задавался вопросом, должен ли я выпустить скопированный NSObject? Например, я создаю только один словарь, который я копирую в массив:
Код:
for (int num = 0; num < [object count]; num++) {
[dictionary setObject:[object objectAtIndex:num] forKey:@"x"];
[array addObject:[dictionary copy]];
}
Я должен выпустить словарь? Если да, когда?
Спасибо
Да, есть. В этом случае вам, вероятно, следует освободить копию сразу после добавления ее в массив, потому что массив сохраняет все, что к нему добавлено:
NSDictionary *copied = [dictionary copy];
[array addObject:copied];
[copied release];
С копией
вы берете право собственности на возвращаемый объект. Контейнеры также становятся владельцами добавленных к ним объектов.
В результате вы должны отказаться от владения копией, как указал Ной. В Руководстве по управлению памятью какао есть раздел, описывающий, как работать с контейнерами .
Этот фрагмент из документации:
- (id) copy
Возвращаемое значение Объект, возвращаемый методом протокола NSCopying copyWithZone :, где зона равно нулю.
Обсуждение Это удобный метод для классов, использующих протокол NSCopying. Если для copyWithZone: нет реализации, возникает исключение.
NSObject сам по себе не поддерживает протокол NSCopying. Подклассы должны поддерживать протокол и реализовывать метод copyWithZone :. Версия подкласса метода copyWithZone: должна сначала отправить сообщение в super, чтобы включить его реализацию, если только подкласс не наследуется непосредственно от NSObject.
Особые соображения Если вы используете управляемую память (не сборку мусора), этот метод сохраняет новый объект перед его возвратом. Однако вызывающая сторона метода отвечает за освобождение возвращенного объекта.
Трудно сказать, не видя, где вы создаете словарь, разумно ли это в любом случае. Если в словаре нет других членов, было бы проще (хотя, возможно, труднее читать :) сделать что-то вроде
for (int num = 0; num < [object count]; num++) {
[array addObject:[NSDictionary
dictionaryWithObject:[object objectAtIndex:num]
forKey:@"x"
]
]
}
Thats даст вам настоящие объекты NSDictionary в вашем массиве, а не NSMutableDictionary копии, которые вы создаете.