Метод установки управления памятью Obj-C - PullRequest
2 голосов
/ 22 июня 2010

Я новичок в Objective-C, и я скачал код с здесь .
Ран Глава 10 , 10.01 CarPartsInit xcode файл проекта.

Одна вещь, которая мне не ясна, заключается в том, что, управление памятью метода сеттера

- (void) setEngine: (Engine *) newEngine
{
    [newEngine retain] 
    [engine release];
    engine = newEngine;
}

должен привести к тому, что двигатель retainCount будет равен 0 в конце программы.

Я запустил какой-то NSLog и когда программа закончилась ... retainCount для двигателя был на 1 ... Должен ли он идти в 0 и быть освобожден? Или это утечка памяти?

Ответы [ 5 ]

4 голосов
/ 22 июня 2010

Вы не должны беспокоиться о сохранении счета. Вы не должны даже смотреть на них. Они просто слишком запутаны - они действительно частная деталь реализации. Показательный пример: количество сохраняемых объектов никогда не обнуляется. Зачем? Потому что нет смысла. Объект с сохраняемым счетчиком 0 будет освобожденным объектом, и это ошибка отправки сообщений на освобожденные объекты (он может сообщать о старом значении 1, или он может сообщать о чем-то совершенно ином, или он может просто вызвать сбой вашей программы) , Пока вы следуете рекомендациям по управлению памятью и инструменты не сообщают о каких-либо утечках, вы должны чувствовать себя нормально.

3 голосов
/ 22 июня 2010

Нет необходимости освобождать все до выхода из программы.Операционная система автоматически восстанавливает всю память, используемую программой.

Обычно не нужно беспокоиться об объектах, которые существуют на протяжении всей программы.У вас действительно есть утечка памяти только в том случае, если вы создаете что-то, но затем теряете ссылку перед ее освобождением.

Примечание: вы можете столкнуться с идиотами, которые утверждают, что программа каким-то образом «неправильна», если она не очищаетсякаждый объект до окончания.Вы можете игнорировать этих людей.

1 голос
/ 22 июня 2010

Все, что экземпляр сохраняет (или выделяет), должно быть освобождено в dealloc.

-(void) dealloc {
  [engine release]; // no need to set to nil in dealloc
  [super dealloc];
}
0 голосов
/ 22 июня 2010

Пока вы инициализировали свой класс, счетчик памяти двигателей будет увеличиваться на единицу (говоря, что вы его инициализируете).
В вашем установщике необходимо сохранить новое значение и освободить старое значение (значение счетчика увеличивается сновое значение, затем счетчик уменьшается, чтобы избавиться от старого значения).Счетчик удержания для этого равен 1.

При закрытии программы вам также необходимо отключить Engine в своей функции dealloc, чтобы быть уверенным, что не произойдет утечка памяти.

AОтличный способ следить за утечками памяти - использовать инструмент «Leaks» в xcode:
run -> Начать с Performance Tool -> Leaks

Другими методами является использование инструмента «Build and analysis» длянайти потенциальные утечки памяти:
Построить> Построить и проанализировать

Надеюсь, я прав с этим, моя цель-c немного заржавела.

0 голосов
/ 22 июня 2010

Давайте рассмотрим, что должен делать setEngine.

  1. кто-то передает newEngine, и вы хотите его использовать.Так что вам нужно «сохранить» его.
  2. У вашей машины, возможно, уже есть двигатель.Итак, вы отпускаете это.(Обратите внимание, что отправка сообщения об освобождении в null ничего не делает)
  3. затем вы присваиваете переданный аргумент "newEngine" свойству автомобиля "engine"Готово.

Если вы хотите увидеть, как удерживать счетчик увеличивается или уменьшается, перезапишите метод «release», чтобы распечатать что-нибудь.Но не забудьте назвать выпуск супер.

...