Использование malloc / free в объекте Objective-C - PullRequest
2 голосов
/ 10 января 2011

У меня есть класс AudioManager с членом типа AudioBufferList *. (Это структура, объявленная в CoreAudio framework). Поскольку AudioBufferList не является NSObject, я не могу его сохранить, поэтому я должен распределить / освободить его (исправьте меня, если я не прав).

Мой вопрос: где «правильное» место, чтобы освободить его? В настоящее время я делаю это в методе dealloc из AudioManager. Если я правильно понимаю, этот метод вызывается автоматически после отправки сообщения release на экземпляр AudioManager --- это правда? Существуют ли другие рекомендуемые практики использования alloc / free для необъектных членов объектов Objective-C?

Edit:

Из документации Apple:

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

Что делает вещи немного яснее - но ценится больше понимания.

Ответы [ 2 ]

1 голос
/ 10 января 2011

Да, вам нужно распределить / освободить память. Здесь есть отличный ответ / пример, включая правильное управление памятью:

iPhone: инициализация и выпуск AudioBufferList

Что касается «когда», вы захотите не только освободить память, когда AudioManager будет выпущен, но также и когда значение вашего AudioBufferList когда-либо будет изменено. Например. Если указатель изначально ссылается на некоторый «экземпляр A» структуры AudioBufferList, и вы изменяете его так, чтобы он указывал на некоторый «экземпляр B» структуры AudioBufferList, то вы захотите освободить память для «экземпляра A», иначе может быть потеряно (И память просочится.)

Один важный момент, и, возможно, это тот, который вы знали, но случайно ошиблись: dealloc не вызывается, когда release отправляется объекту. Экземпляр NSObject освобождается только тогда, когда его счетчик хранения достиг нуля. Объект может иметь счет сохранения 2 , и после отправки [myObject release] его счет хранения станет 1 . Но не будет отправлено сообщение dealloc, поскольку это означает, что некоторый другой объект все еще «владеет» этим экземпляром и полагается, что объект останется выделенным и доступным.

0 голосов
/ 10 января 2011

Вам не нужно делать malloc или free на нем. Вы бы использовали структуру, такую ​​как CGRect или AudioBufferList, так же, как вы бы использовали int или double. Нет проблем с retain, alloc, dealloc, release и т. Д. Для необъектных типов.

Что касается метода dealloc для AudioManager, он не будет вызываться автоматически при отправке сообщения release, он будет вызываться автоматически, когда счет сохранения равен 0. Отправка сообщения release в объект уменьшает счет сохранения на 1. У него могут быть другие вещи, которые его сохраняют, и в этом случае он еще не будет освобожден.

Редактировать

Пример использования Apple структурных типов:

CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}
...