2012-11-05 3 views
0

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 возвращает объект, который не, неявно сохраненный отправителем.

ответ

1

Да это нужно быть освобожден, но я бы не использовать autorelease в цикле, как это, сделать это вручную с каждой итерации

for (MyObject *obj in myArray) 
    { 
     MyObject *copy = [obj copy]; 
     [destination addObject:copy]; 
     [copy release]; 
    } 
+0

Ok, что имеет смысл. Использует 'autorelease' неправильный? Или это просто повлечет за собой удар производительности? – SundayMonday

+1

Копии сохраняются в любом случае массивом, поэтому в этом случае не так много разной производительности. Но это хорошая привычка явно выделять, когда вы можете, особенно в жестких петлях - более чистый код. – trapper