Нет причины для вызова метода dealloc
: у вашего объекта все еще ненулевой счетчик ссылок.
Каждый раз, когда вы создаете объект, он начинает свое существование со счетчика ссылок 1.Как только этот счет достигает 0, он освобождается.Существуют определенные правила для управления памятью, которые помогают нам всем оставаться в здравом уме.Эти правила говорят о «владении объектом».
По сути, вы становитесь владельцем объекта, если выполняете одно из следующих условий:
- Вы вызываете
retain
для объекта; - Вы получаете объект, вызывая
copy
или mutableCopy
для другого; - Вы вызываете метод
alloc
для объекта.
Всякий раз, когда вы владеете объектом, вы несете ответственность за освобождение, если он вам больше не нужен .Он будет удален только в том случае, если он больше никому не нужен.
В вашем фрагменте вы создаете объект, который вы передаете в свой массив.Ваш массив начинает использовать его, поэтому он вызывает retain
(так что он остается в живых, пока его удерживают).Однако, как только вы release
массиве, ваш объект все еще должен быть освобожден вами , так как вы вызвали метод alloc
.
EDIT Простой фрагмент:
TheShape *aShape = [[TheShape alloc] init];
[aShape release];
должен показать сообщение, хотя.: /
Есть две причины, по которым я вижу, что этого не происходит:
- Вы сделали что-то странное с помощью метода
alloc
, init
или release
(в которомcase, опубликуйте свой код); - Вы работаете в сборщике мусора, и
dealloc
просто никогда не будет вызываться (это finalize
, которое вы должны использовать в этом случае).Хотя я не понимаю, почему +new
тогда release
даст тогда ожидаемые результаты.