#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:
.