Объект allocWithZone должен быть выпущен

#objective-c

#objective-c

Вопрос:

Должен ли объект, возвращаемый allocWithZone, быть освобожден? т. Е. Это то же самое, что alloc и new?

 - (id) copyWithZone: (NSZone *) zone
{
Engine *engineCopy;
engineCopy = [[[self class] allocWithZone:zone]init];

return (engineCopy);
}
  

Ответ №1:

Да, вам все еще нужно его освободить. Смотрите документацию для NSObject: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

Если вы используете управляемую память (не сборку мусора), этот метод сохраняет объект перед его возвратом. Возвращенный объект имеет количество сохранений, равное 1, и не выпущен автоматически. Вызывающий этот метод отвечает за освобождение возвращаемого объекта, используя либо release, либо autorelease.

Комментарии:

1. но в учебнике, который я читаю, говорится, что следующий метод хорош с точки зрения памяти — см. Редактирование

2. Смотрите документацию по NSCopying, developer.apple.com/library/mac/#documentation/Cocoa/Reference / … но в основном предполагается, что вызов copyWithZone аналогичен alloc, т. Е. он возвращает объект с числом сохранений, равным 1.

3. @TheLearner: учебник в порядке. Опубликованный вами фрагмент кода в порядке, потому что copyWithZone: предполагается, что он возвращает объект, которым владеет вызывающий. Не освобождая объект, созданный с помощью allocWithZone: , перед его возвратом, метод фактически передает право собственности вызывающему. Это то, что вы хотите.

4. но он никогда не будет выпущен

5. В данном случае именно код, вызывающий copyWithZone, отвечает за освобождение объекта.

Ответ №2:

new объединяет alloc и init . Это то, alloc что требует освобождения; allocWithZone: почти никогда не должен вызываться напрямую ( alloc вызывает его внутренне) и в основном используется по устаревшим причинам. Update аналогично, copyWithZone: не следует (почти) вызывать напрямую; однако copy это будет вызываться неявно. Inside copyWithZone: — это , наверное , единственное место , куда я когда- либо звонил allocWithZone: .