Apple NSCopying docs утверждает, что copyWithZone:
возвращает объект, который неявно сохраняется отправителем. Поэтому, когда этот объект добавляется к NSMutableArray
, кажется, что объект должен быть отправлен сообщение autorelease
, чтобы сохранить баланс счета сбалансированным (так как массив сохранит объект).Управление памятью NSCopying и Objective-C
Так глубокой копии содержимое одного массива в другой, я бы ожидать, что-то вроде:
NSMutableArray *destination = [NSMutableArray array];
// assume MyObject adopts NSCopying
for (MyObject *obj in myArray)
[destination addObject:[[obj copy] autorelease]];
Однако я заметил другой подход в this answer. Похоже, что [ret addObject:[val copy]]
- это утечка памяти. Однако я новичок в NSCopying
, поэтому я подумал, что задаю вопрос: При добавлении скопированного объекта в массив следует отправить объекту сообщение автоопределения, чтобы сохранить баланс счета сбалансированным?
Редактировать - больше информации: Clang сообщает о потенциальной утечке памяти после удаления авторекламы. Возможно, связанный ответ предполагает, что copy
возвращает объект, который не, неявно сохраненный отправителем.
Ok, что имеет смысл. Использует 'autorelease' неправильный? Или это просто повлечет за собой удар производительности? – SundayMonday
Копии сохраняются в любом случае массивом, поэтому в этом случае не так много разной производительности. Но это хорошая привычка явно выделять, когда вы можете, особенно в жестких петлях - более чистый код. – trapper